java - delphi xe5 Wifimanager 和 WifiInfo 转换

标签 java android delphi-xe5

我试图隐藏 wifimanager 和 wifiinfo (android),但我不明白为什么我有段错误,我看到 wifimanager 运行良好,但是当我尝试调用 wifiinfo 的某些方法时,我得到“段错误”。我的代码:

http://developer.android.com/reference/android/net/wifi/WifiInfo.html http://developer.android.com/reference/android/net/wifi/WifiManager.html

unit wifi1;

interface

uses
System.SysUtils,
Androidapi.JNIBridge,
Androidapi.JNI.GraphicsContentViewText,
Androidapi.JNI.JavaTypes,
FMX.Helpers.Android;

//-------------------------------- wifi manager ---------------------------------------//
type
JWifiManager = interface;
JWifiInfo = interface;

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.WifiManager')]
JWifiManager = interface(JObject)
['{DA7107B9-1FAD-4A9E-AA09-8D5B84614E60}']
function isWifiEnabled:Boolean;cdecl;
function setWifiEnabled(enabled:Boolean):Boolean; cdecl;
//function getConfiguredNetworks : JList;cdecl;
function getConnectionInfo :JWifiInfo; cdecl;
end;
TJWifiManager = class(TJavaGenericImport<JWifiManagerClass, JWifiManager>) end;
//-------------------------------- wifi info ---------------------------------------//
JWifiInfoClass = interface(JObjectClass)
['{2B1CE79F-DE4A-40D9-BB2E-7F9F118D8C08}']
function _GetLINK_SPEED_UNITS:JString;
property LINK_SPEED_UNITS: JString read _GetLINK_SPEED_UNITS;
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;
TJWifiInfo= class(TJavaGenericImport<JWifiInfoClass, JWifiInfo>)
end;
implementation
end.
//-----------------------------------------------------------------------

我的测试是:

var obj:jobject;
wm:jwifimanager;
Winfo:jwifiinfo;
ip:integer;
mac:string;
jmac:JString;
begin
obj:=SharedActivity.getSystemService(TJActivity.JavaClass.WIFI_SERVICE);
wm:= Tjwifimanager.Wrap((obj as ILocalObject).GetObjectID);

Winfo:=TJWifiInfo.Create;
winfo:=wm.getconnectioninfo; <- segmentation fault
ip:=winfo.getIpAddress;
jmac:=winfo.getMacAddress;
mac:=JStringToString(jmac);
end;

这有什么问题吗? (wifimanager的方法有效,但getconnectioninfo无效)

原始 JAVA 帖子:Detect wifi IP address on Android?

LOGCAT 当我调用此函数时:logcat

这是delphi中的项目:PROJECT DELPHI

最佳答案

它的主要错误是缺乏对 nil 值的检查,从而导致您的段错误(至少我期望情况如此 - 例如,wm 为零)。

您可以尝试引用 this SO answer 中的代码 fragment 作为使用 Android 网络类的一般指南。现在这应该有所帮助,而不是直接指向代码中的错误。尝试该代码并确保您了解它是如何运行的。然后它应该可以帮助您识别代码 fragment 中的错误。

代码的一个潜在问题是属性使用点分隔符,但 RTL Android 类属性以及前面提到的代码 fragment 使用/作为分隔符。

明智地使用 logcat(例如从监​​视器应用程序内部)将有助于通过查看操作系统在该应用程序执行期间抛出的日志消息来确定是否是这种情况。

哦,还有一件事应该首先检查 - 您是否已将访问 wifi 状态权限添加到您的应用中?这会导致访问 wifi 状态信息的问题,当然。

关于java - delphi xe5 Wifimanager 和 WifiInfo 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19794024/

相关文章:

android - 如何在 onDraw 方法之外获取自定义 View 的 Canvas 大小?

Android 应用程序,Activity 启动滞后于 viewpager

delphi - 从 D2006 移植到 XE5 后偶发的访问冲突在 XP 兼容模式下不会发生

mysql - Delphi xe5中的Zeoslib安装

java - 如何在java中通过电子邮件发送呈现的html文件

java - 用for循环返回

java - 使用一对一关系时如何修复 "A different object with the same identifier value was already associated with the session"错误

android - Adb 安装/上传 apk 需要很长时间

android - 如何使用 Delphi XE5 在 Android 上访问 OpenGL 渲染上下文?

java - 一个月的第一天