原文地址:https://www.cnblogs.com/hankzhouAndroid/p/6554131.html
今日发现一个问题,系统要求从设备上获取一个唯一码作为当前登录用户的唯一标识;
之前尝试过很多方法,最后决定采用mac地址。
官方获取mac地址的方法是:
1
2
3
4
5
6
7
|
public
static
String getWifiMac(Context ctx) {
WifiManager wifi = (WifiManager) ctx.getSystemService(Context.WIFI_SERVICE);
WifiInfo info = wifi.getConnectionInfo();
String str = info.getMacAddress();
if
(str ==
null
) str =
""
;
return
str;
}
|
但是最后发现,某些设备上(比如乐视2手机,谷歌的Nexus9 pad),用这种方式获取的mac地址都是02:00:00:00:00:00 .
并不能起到唯一标识的作用。
后来发现,Android的内核是linux,那么应该可以通过shell命令的方式来获取。
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
/**
* 这是使用adb shell命令来获取mac地址的方式
* @return
*/
public
static
String getMac() {
String macSerial =
null
;
String str =
""
;
try
{
Process pp = Runtime.getRuntime().exec(
"cat /sys/class/net/wlan0/address "
);
InputStreamReader ir =
new
InputStreamReader(pp.getInputStream());
LineNumberReader input =
new
LineNumberReader(ir);
for
(;
null
!= str; ) {
str = input.readLine();
if
(str !=
null
) {
macSerial = str.trim();
// 去空格
break
;
}
}
}
catch
(IOException ex) {
// 赋予默认值
ex.printStackTrace();
}
return
macSerial;
}
|
解决上述两种设备上mac地址获取错误的问题。
可见,就算是谷歌官方给出的解决方案也未必可靠,要根据实际情况酌情考虑使用。
另外,尝试了一下在4G网络下获取mac地址,结果是null。说明 4G网络下不会有mac地址这一说,因为根本获取不到。3G网也应该类似(没做试验)。
但是有些设备,运行shell命令会报错:权限被拒绝。(Nexus 9 pad亲测,这个方法不灵);这就很尴尬了。。