Android wifiMac地址显示异常坑

博客讲述了在Android 10及以上版本中,由于系统对获取WiFi MAC地址的限制,传统方法返回的是02:00:00:00:00:00。作者通过研究源码和尝试不同方法,最终找到了通过反射调用`getFactoryMacAddresses`获取真实MAC地址的解决方案,适配了Android Q及更高版本。
摘要由CSDN通过智能技术生成

1、由于最近项目上线,之前一直使用Android 10  都是通过WifiInfo获取mac地址 如下所示


    /**
     * Return dynamic information about the current Wi-Fi connection, if any is active.
     * <p>
     * In the connected state, access to the SSID and BSSID requires
     * the same permissions as {@link #getScanResults}. If such access is not allowed,
     * {@link WifiInfo#getSSID} will return {@code "<unknown ssid>"} and
     * {@link WifiInfo#getBSSID} will return {@code "02:00:00:00:00:00"}.
     *
     * @return the Wi-Fi information, contained in {@link WifiInfo}.
     */
    public WifiInfo getConnectionInfo() {
        try {
            return mService.getConnectionInfo(mContext.getOpPackageName());
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

2、一般默认wifi地址都是020000000000这种格式

   /**
     * Record the MAC address of the WLAN interface
     * @param macAddress the MAC address in {@code XX:XX:XX:XX:XX:XX} form
     * @hide
     */
    @UnsupportedAppUsage
    public void setMacAddress(String macAddress) {
        this.mMacAddress = macAddress;
    }

    public String getMacAddress() {
        return mMacAddress;
    }

3、然后于是我到网上搜索

// Android 6.0以上获取WiFi的Mac地址

//由于android6.0对wifi mac地址获取进行了限制,用原来的方法获取会获取到02:00:00:00:00:00这个固定地址。

//但是可以通过读取节点进行获取"/sys/class/net/wlan0/address"

4、于是我尝试获取

 5、网上某书上面的代码如下 于是尝试一波还是没用?

 6、在这里解析下AndroidQ之后分为两种mac地址 设备wifiMac随机Mac  看了这我内心是慌的一P,这条路又走不通了?

7、于是再去百度搜索,在 Android Q 中需要获取 Wifi MAC Address,使用 wifiInfo.getMacAddress() 接口,发现获取到的值为 02:00:00:00:00:00,与真实值对不上。也不行哈,代码大概如下:

     


        WifiManager mWifiManager = (WifiManager) 
        getActivity().getSystemService(WIFI_SERVICE);
        WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
        String macAddress = wifiInfo.getMacAddress();

8、于是去硬着头皮去看源码,此处省略几个小时。。。。。。。请自行脑补哈

9、最后在WifiManager里面找到一个updateConnectivity方法于是开始尝试

10、好像这个是系统Systetem Api,那我们应用层该怎么拿呢?要不通过修改framework WifiManager源码 仿照这种写法 然后重新编译源码,另外系统权限因为我们设备已经root过,于是我想到由于项目里面targetsdk还是29 但是我们的平板设备是Android 12(S)SDK版本31  如下

11、这时候脑袋里面又有另外一种想法,framework目前还不是很熟,用反射尝试下?于是写了下面这种代码, 想起来以前大学Java老师说的,反射天下无敌,开始尝试通过反射getFactoryMacAddresses拿,就是如果当前sdk版本大于28 Android 9 反射获取 否则还是通过wifiinfo.connectionInfo.macAddress获取。下面正常显示wifi设备mac地址 唯一标识,到这里基本就是结束了。

/**
 * 扩展函数——获取Mac地址
 */
@SuppressLint("BlockedPrivateApi", "HardwareIds")
fun WifiManager.getMacAddress(): String {
    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) {
        // 反射调用
        val clazz = WifiManager::class.java
        val method = clazz.getDeclaredMethod("getFactoryMacAddresses")
        val macArray = method.invoke(this) as Array<String>? // String[]
        // 直接调用
        //val macArray : Array<String>? = this.factoryMacAddresses
        if (!macArray.isNullOrEmpty()) {
            return macArray[0]
        }
    }
    return connectionInfo.macAddress
}

 转载请注明出处谢谢 Android wifiMac地址显示异常坑_KdanMin的博客-CSDN博客_android10 mac地址

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值