日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android动态mac地址,Android 版本兼容 — Android 6.0 和 7.0后获取Mac地址

發布時間:2024/3/13 Android 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android动态mac地址,Android 版本兼容 — Android 6.0 和 7.0后获取Mac地址 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Android 6.0 和 7.0后獲取Mac地址

隨著Android的版本迭代,獲取設備的Mac地址也發生了改變。這里找到了最新的適配方案(適配當前的最新版本Android 9.0),并且記錄了整個適配的修復過程,以供參考。

Android 6.0 之前,獲得Mac地址的通用方式

必須的權限 < uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

/**

* Android 6.0 之前(不包括6.0)

* 必須的權限

* @param context

* @return

*/

private static String getMacDefault(Context context) {

String mac = "02:00:00:00:00:00";

if (context == null) {

return mac;

}

WifiManager wifi = (WifiManager) context.getApplicationContext()

.getSystemService(Context.WIFI_SERVICE);

if (wifi == null) {

return mac;

}

WifiInfo info = null;

try {

info = wifi.getConnectionInfo();

} catch (Exception e) {

}

if (info == null) {

return null;

}

mac = info.getMacAddress();

if (!TextUtils.isEmpty(mac)) {

mac = mac.toUpperCase(Locale.ENGLISH);

}

return mac;

}

Android 6.0 — Android 7.0之前

Android 6.0 變更

硬件標識符訪問權

為給用戶提供更嚴格的數據保護,從此版本開始,對于使用 WLAN API 和 Bluetooth API 的應用,Android 移除了對設備本地硬件標識符的編程訪問權。WifiInfo.getMacAddress() 方法和 BluetoothAdapter.getAddress() 方法現在會返回常量值 02:00:00:00:00:00。

上面是官網說明,很顯然如果采用原有的方式獲得是默認的值 02:00:00:00:00:00

這里采用的是讀取系統的這個文件

/**

* Android 6.0(包括) - Android 7.0(不包括)

* @return

*/

private static String getMacAddress() {

String WifiAddress = "02:00:00:00:00:00";

try {

WifiAddress = new BufferedReader(new FileReader(new File("/sys/class/net/wlan0/address"))).readLine();

} catch (IOException e) {

e.printStackTrace();

}

return WifiAddress;

}

Android 7.0 之后

然而有一天發現在Android 7.0手機上,上面的那種方式出現異常了,并且提醒

/sys/class/net/wlan0/address permission denied

很顯然,從7.0后,權限被拒絕,涼涼

從網上找到了另一種方案,通過掃描各個網絡接口來獲取Mac地址,并且這種方式在Android 6.0上同樣有效

必須的權限 < uses-permission android:name="android.permission.INTERNET" />

/**

* 遍歷循環所有的網絡接口,找到接口是 wlan0

* 必須的權限

* @return

*/

private static String getMacFromHardware() {

try {

List all = Collections.list(NetworkInterface.getNetworkInterfaces());

for (NetworkInterface nif : all) {

if (!nif.getName().equalsIgnoreCase("wlan0")) continue;

byte[] macBytes = nif.getHardwareAddress();

if (macBytes == null) {

return "";

}

StringBuilder res1 = new StringBuilder();

for (byte b : macBytes) {

res1.append(String.format("%02X:", b));

}

if (res1.length() > 0) {

res1.deleteCharAt(res1.length() - 1);

}

return res1.toString();

}

} catch (Exception e) {

e.printStackTrace();

}

return "02:00:00:00:00:00";

}

適配方案

在Android 4.4.4上,以上三種方式全部有效

Android 4.4.4

在Android 6.0 上,除了第一種Android 6.0之前的這個方案無效,剩下兩個都是有效的

Android 6.0

在Android 9.0上,只有第三種方案是有效的

Android 9.0

雖然第三種方案都是有效的,但這里我采用的是按照版本使用,如下

/**

* 獲取MAC地址

*

* @param context

* @return

*/

public static String getMacAddress(Context context) {

String mac = "02:00:00:00:00:00";

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {

mac = getMacDefault(context);

} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {

mac = getMacFromFile();

} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {

mac = getMacFromHardware();

}

return mac;

}

AndroidManifest.xml

總結

以上是生活随笔為你收集整理的android动态mac地址,Android 版本兼容 — Android 6.0 和 7.0后获取Mac地址的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。