最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Qt for Android(十三) —— Android Q 适配之获取唯一标识

    正文概述 掘金(_q2nAmor)   2021-08-13   728

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


    起源地下载网 » Qt for Android(十三) —— Android Q 适配之获取唯一标识

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元