XE7 ,如何获取安卓手机的MAC地址??

draculamx 2015-05-27 03:57:27
本以为是个很简单的问题,在网上搜了一圈,居然没有。。。。
...全文
525 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
dyq831020 2015-06-05
  • 打赏
  • 举报
回复
pas 源码中 JObject {java/util/BitSet} 这样不知道是什么意思!请妖哥指点1 2 property allowedAuthAlgorithms: JObject {java/util/BitSet} read _GetallowedAuthAlgorithms write _SetallowedAuthAlgorithms; property allowedGroupCiphers: JObject {java/util/BitSet} read _GetallowedGroupCiphers write _SetallowedGroupCiphers; property allowedKeyManagement: JObject {java/util/BitSet} read _GetallowedKeyManagement write _SetallowedKeyManagement; property allowedPairwiseCiphers: JObject {java/util/BitSet} read _GetallowedPairwiseCiphers write _SetallowedPairwiseCiphers; property allowedProtocols: JObject {java/util/BitSet} read _GetallowedProtocols write _SetallowedProtocols;
dyq831020 2015-06-05
  • 打赏
  • 举报
回复
补上java的代码 localWifiConfiguration1.preSharedKey = ("\"" + passawrd + "\""); localWifiConfiguration1.hiddenSSID = true; localWifiConfiguration1.allowedAuthAlgorithms.set(0); localWifiConfiguration1.allowedGroupCiphers.set(2); localWifiConfiguration1.allowedKeyManagement.set(1); localWifiConfiguration1.allowedPairwiseCiphers.set(1); localWifiConfiguration1.allowedGroupCiphers.set(3); localWifiConfiguration1.allowedPairwiseCiphers.set(2);
dyq831020 2015-06-05
  • 打赏
  • 举报
回复
我这里再楼主的基础上,继续增加功能,扫描 显示wifi热点,链接到已经配置好的热点,等等都没问题,可要加入自己指定的一个没有连接过的热点的时候,创建wificonfig的时候,参考java的代码,使用了set方法,来设置加密类型,可delphi 和c++ builder都没有这个方法 _SetallowedAuthAlgorithms这个函数的参数 是个_di_JObject 类型,这里很迷茫!查阅了java的资料set方法其实就是设置一个字节的某些位,可一个设置过某些位的字节,再c++ builder中如何设置成一个_di_JObject 的类型呢! _di_JWifiConfiguration wifiConfig1 = TJWifiConfiguration::Create(); wifiConfig1->SSID = ScanResult->SSID; if(JStringToString(ScanResult->capabilities).SubString(1,3) == "WEP"){ wifiConfig1->hiddenSSID = true; wifiConfig1->wepKeys[0].operator[](0) = StringToJString("\\duyanqing\\"); wifiConfig1->_SetallowedAuthAlgorithms(WifiConfigAuthAlgorithmClass->SHARED); wifiConfig1->_SetallowedGroupCiphers(WifiConfigurationGroupCipherClass->CCMP); wifiConfig1->_SetallowedGroupCiphers(WifiConfigurationGroupCipherClass->TKIP); wifiConfig1->_SetallowedGroupCiphers(WifiConfigurationGroupCipherClass->WEP40); wifiConfig1->_SetallowedGroupCiphers(WifiConfigurationGroupCipherClass->WEP104); wifiConfig1->_SetallowedKeyManagement(WifiConfigKeyMgmtClass->NONE); wifiConfig1->_SetwepTxKeyIndex(0); } WifiManager->enableNetwork(wifiConfig1->networkId,true);
ccrun.com 2015-05-30
  • 打赏
  • 举报
回复
为了两个字:兼容。 JObject / JWifiManager / JWifiInfo 都是 Delphi 的接口 (interface) ,C++Builder 编译器不能直接实现象 Delphi 的接口一样的引用计数,需要通过智能指针来封装原始的接口,于是我们看到 System 提供的 DelphiInterface 模板类包装了 Delphi 接口,有了相应的 _di_JObject / _di_JWifiManager / _di_JWifiInfo 类型,能方便的实现引用计数。 C++Builder 调用 Delphi 接口的时候经常有这样的情况,比如在调用 WebService 的时候 (用import WSDL功能生成的代码)
draculamx 2015-05-30
  • 打赏
  • 举报
回复
引用 9 楼 ccrun 的回复:
为了两个字:兼容。 JObject / JWifiManager / JWifiInfo 都是 Delphi 的接口 (interface) ,C++Builder 编译器不能直接实现象 Delphi 的接口一样的引用计数,需要通过智能指针来封装原始的接口,于是我们看到 System 提供的 DelphiInterface 模板类包装了 Delphi 接口,有了相应的 _di_JObject / _di_JWifiManager / _di_JWifiInfo 类型,能方便的实现引用计数。 C++Builder 调用 Delphi 接口的时候经常有这样的情况,比如在调用 WebService 的时候 (用import WSDL功能生成的代码)
还是妖哥厉害,解答了我心中的疑问,多谢!
draculamx 2015-05-29
  • 打赏
  • 举报
回复
妖哥,我也找到了这个内容,而且有源代码下载,和这个代码几乎相同,但是,我把它改写成了C++的,编译通过,但是手机上一运行就直接报 AV 错误。。。
ccrun.com 2015-05-29
  • 打赏
  • 举报
回复
Google一下,人人都是专家。 http://www.gesource.jp/weblog/?p=6875
draculamx 2015-05-29
  • 打赏
  • 举报
回复
这个程序,最关键的头文件,我也贴出来,麻烦妖哥给我讲讲,为什么我第一次写的代码,编译可以通过,但是运行不了,最后修改的代码,你也可以看到,我只是修改了3个变量的数据类型,为什么要这么改呢??? http://pan.baidu.com/s/1gd90dbX 本来想贴上来,但是内容超过10000??无奈,上传到云盘。。。 我真的很想知道为什么要这么改。。。。
draculamx 2015-05-29
  • 打赏
  • 举报
回复
为了方便大家交流,我把代码贴出来 首先是 Delphi 的代码,这些代码在楼上妖哥给的链接里面有,大家可以去看,我贴出最关键的部分

uses
  Androidapi.JNI.Wifi,
  Androidapi.Helpers,
  Androidapi.JNI.JavaTypes,
  Androidapi.JNI.GraphicsContentViewText,
  Androidapi.JNIBridge;

procedure TForm1.FormCreate(Sender: TObject);
var
  Obj: JObject;
  WifiManager: JWifiManager;
  WifiInfo: JWifiInfo;
begin
  Obj := SharedActivityContext.getSystemService
    (TJContext.JavaClass.WIFI_SERVICE);
  if Obj = nil then
    Exit;
  WifiManager := TJWiFiManager.Wrap((Obj as ILocalObject).GetObjectID);
  WifiInfo := WifiManager.getConnectionInfo;
接下来,是我第一次将它改写成BCB的代码:

	JObject *WifiManagerObj;
	JWifiManager *WifiManager;
	JWifiInfo *WifiInfo;

	WifiManagerObj = SharedActivityContext()->getSystemService(TJContext::JavaClass->WIFI_SERVICE);

	if( WifiManagerObj !=NULL )
	{
		WifiManager = TJWifiManager::Wrap( static_cast<_di_ILocalObject>(WifiManagerObj*)->GetObjectID());
		WifiInfo = WifiManager->getConnectionInfo();
		lblDecrypt->Text=JStringToString(WifiInfo->getMacAddress());
	}
这段代码可以编译通过,但是手机上面一运行,就直接出AV错误 然后我就在网上到处找,到处看,试了好多代码,都不行,因为我的手机是安卓5.0,XE7是4.2所以我一度怀疑是SDK的问题,毕竟我没写过安卓程序,完全不了解。但是当我搜索了一番更新XE7安卓SDK的方法后,我还是放弃了,万一整坏了咋办,又要重新装,麻烦。 最终我修改代码如下,可以顺利在手机上读取wifi的MAC地址了:

	_di_JObject WifiManagerObj;
	_di_JWifiManager WifiManager;
	_di_JWifiInfo WifiInfo;

	WifiManagerObj = SharedActivityContext()->getSystemService(TJContext::JavaClass->WIFI_SERVICE);

	if( WifiManagerObj !=NULL )
	{
		WifiManager = TJWifiManager::Wrap( static_cast<_di_ILocalObject>(WifiManagerObj)->GetObjectID());
		WifiInfo = WifiManager->getConnectionInfo();
		lblDecrypt->Text=JStringToString(WifiInfo->getMacAddress());
	}
这就是最后的代码在标签“lblDecrypt”中,将会显示手机的MAC地址,至于为什么这样改,我也不知道。。。。 所以我想请妖哥给解答一下,因为在头文件中,这些类型被声明为“Interfac”,在语法上我不知道怎么弄,可以说写出这个程序,运气也占一部分成分吧。。。。
draculamx 2015-05-29
  • 打赏
  • 举报
回复
多谢妖哥关心,搞定了。。。代码没啥问题,关键是我对 C++ 的语法还是不扎实。。。。 换了数据类型就OK了。。。
ccrun.com 2015-05-29
  • 打赏
  • 举报
回复
把代码贴出来看看。
draculamx 2015-05-28
  • 打赏
  • 举报
回复
嗯,我这是我第一个想到的,目前正在尝试中
缘中人 2015-05-28
  • 打赏
  • 举报
回复
你搜搜delphi的方法,然后参考着写一个

1,315

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧