Qt for Android(十三) —— Android Q 适配之获取唯一标识

1,716 阅读1分钟

这是我参与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(最优解)