2014-04-11 3 views
0

안드로이드 장치 (특히 WiFi 어댑터)로부터 IP 주소를 얻으려고합니다. WiFi 상태 (이 예에서는 포함되지 않은 현재 AP와의 연결을 끊어도)를 얻을 수 있었지만 IP 주소를 얻을 수 없었습니다. 응용 프로그램이 예외없이 종료됩니다.델파이 XE5 안드로이드는 WiFi ip 주소를 얻습니다.

도와 주실 수 있습니까?

나는 전체 프로젝트에 here을 첨부했습니다.

uses 
    System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 
    FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls, 
    FMX.Helpers.Android, 
    Androidapi.JNIBridge, 
    Androidapi.JNI.GraphicsContentViewText, 
    Androidapi.JNI.JavaTypes, 
    Androidapi.JNI, FMX.Layouts, FMX.Memo; 

...

implementation 

type 
    JWifiManagerClass = interface(JObjectClass) 
    ['{69F35EA7-3EB9-48AA-B7FC-4FFD0E7D712F}'] 
    function _GetACTION_PICK_WIFI_NETWORK: JString; 
    function _GetEXTRA_WIFI_INFO: JString; 
    function _GetWIFI_STATE_CHANGED_ACTION: JString; 
    property ACTION_PICK_WIFI_NETWORK: JString read _GetACTION_PICK_WIFI_NETWORK; 
    property EXTRA_WIFI_INFO: JString read _GetEXTRA_WIFI_INFO; 
    property WIFI_STATE_CHANGED_ACTION: JString read _GetWIFI_STATE_CHANGED_ACTION; 
    end; 

    [JavaSignature('android.net.wifi.WifiInfo')] 
    JWifiInfo = interface(JObject) 
    ['{4F09E865-DB04-4E64-8C81-AEFB36DABC45}'] 
    function getBSSID:jString; cdecl; 
    function getHiddenSSID:Boolean; cdecl; 
    function getIpAddress:Integer; cdecl; 
    function getLinkSpeed:integer; cdecl; 
    function getMacAddress:JString; cdecl; 
    function getNetworkId:integer; cdecl; 
    function getRssi:integer; cdecl; 
    function GetSSID:jString; cdecl; 
    end; 

    JWifiInfoClass = interface(JObjectClass) 
    ['{2B1CE79F-DE4A-40D9-BB2E-7F9F118D8C08}'] 
    function _GetLINK_SPEED_UNITS:JString; 
    property LINK_SPEED_UNITS: JString read _GetLINK_SPEED_UNITS; 
    end; 

    TJWifiInfo= class(TJavaGenericImport<JWifiInfoClass, JWifiInfo>) end; 

    [JavaSignature('android.net.wifi.WifiManager')] 
    JWifiManager = interface(JObject) 
    ['{DA7107B9-1FAD-4A9E-AA09-8D5B84614E60}'] 
    function isWifiEnabled:Boolean;cdecl; 
    function setWifiEnabled(enabled:Boolean):Boolean; cdecl; 
    function getConnectionInfo :JWifiInfo; cdecl; 
    function getWifiState :Integer; cdecl; 
    function disconnect :Boolean; cdecl; 
    end; 

    TJWifiManager = class(TJavaGenericImport<JWifiManagerClass, JWifiManager>) end; 


function GetWiFiManager: JWifiManager; 
var ConnectivityServiceNative: JObject; 
begin 
    ConnectivityServiceNative := SharedActivityContext.getSystemService(TJContext.JavaClass.WIFI_SERVICE); 
    if not Assigned(ConnectivityServiceNative) then 
    raise Exception.Create('Could not locate Connectivity Service'); 
    Result := TJWifiManager.Wrap(
    (ConnectivityServiceNative as ILocalObject).GetObjectID); 
    if not Assigned(Result) then 
    raise Exception.Create('Could not access Connectivity Manager'); 
end; 

...

var WiFiManager: JWifiManager; 
    info: JWiFiInfo; 
    ip: Integer; 
begin 
    WifiManager := GetWiFiManager; 
    info := WifiManager.getConnectionInfo; // <- Crash without exception 
    ip := info.getIpAddress; 

답변

1

몇 일을 시도 후에 나는 인터페이스 선언의 JavaSignature 속성에 /.을 교체하는 것은 할 것 같다 발견 속임수.

코드로 하나의 잠재적 인 문제는 속성이 점 분리기를 사용하지만 RTL 안드로이드 클래스는 함께 속성 :

[JavaSignature('android/net/wifi/WifiManager')] 

[JavaSignature('android/net/wifi/WifiInfo')] 
question에서 인용 앞서 언급 한 스 니펫, /를 구분 기호로 사용하십시오.

관련 문제