这是我参与8月更文挑战的第13天,活动详情查看:8月更文挑战
背景
我们产品之前的唯一标识是通过android.os.Build.SERIAL
或者Build.getSerial() 获取,但是在Android 10之后这个方法会返回unknow或者空。因此在Android 10 之后此方法便不可行了。
在Android P之后,Android系统的安全和数据更加隐私,所以通过 getMacAddress()
方法
获取的无线mac地址会被随机化。但是我们的产品是运行在瑞星微板卡上的LCD广告机应用,是有有线网口的。有线的网口mac地址肯定不会变化了,因此我们的方案是获取etho的mac地址(etho代表以太网,wlan0代表了无线网卡)。
代码
public String getSerialNumber() {
String serial = "";
System.out.println("getSerialNumber Begin\n");
try {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {//8.0-
serial = execCmd("getprop ro.boot.serialno");
System.out.println("getprop.serialno:" + serial+"\n");
}else{
serial = getMacEth0();
}
} catch (Exception e) {
e.printStackTrace();
}
if(TextUtils.isEmpty(serial))
{
serial = getAndroidID();
}
System.out.println("getSerialNumber end"+"\n");
return serial;
}
private String getMacEth0() {
try {
//获取本机器所有的网络接口,找以太网卡
Enumeration enumeration = NetworkInterface.getNetworkInterfaces();
while (enumeration.hasMoreElements()) {
NetworkInterface networkInterface = (NetworkInterface)enumeration.nextElement();
//获取硬件地址,一般是MAC
byte[] arrayOfByte = networkInterface.getHardwareAddress();
if (arrayOfByte == null || arrayOfByte.length == 0) {
continue;
}
StringBuilder stringBuilder = new StringBuilder();
for (byte b : arrayOfByte) {
//格式化为:两位十六进制加冒号的格式,若是不足两位,补0
stringBuilder.append(String.format("%02X:", new Object[] { Byte.valueOf(b) }));
}
if (stringBuilder.length() > 0) {
//删除后面多余的冒号
stringBuilder.deleteCharAt(stringBuilder.length() - 1);
} String str = stringBuilder.toString();
// wlan0:无线网卡 eth0:以太网卡
if (networkInterface.getName().equals("eth0")) {
return str;
}
}
} catch (SocketException socketException) {
return "";
}
return "";
}
private String getAndroidID()
{
String m_szAndroidID = Settings.Secure.getString(getApplicationContext().getContentResolver(),
Settings.Secure.ANDROID_ID);
return m_szAndroidID;
}
上面的代码给出了两种方案,1是使用了优化的获取mac地址的方式。 二是使用ANDROID_ID。但是AndroidID有个缺点,root、刷机或恢复出厂设置都会导致设备的ANDROID_ID发生改变,因此如果没有此类场景的话,其实建议用ANDROID_ID,方便可靠。
如果你没有有线网口,那请参考下面的文章获取唯一标识:
Android 10获取设备标识方案探究
Android Q(安卓10)获取唯一ID(最优解)
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!