美文网首页Android开发经验谈Android开发Android开发
Android开发 - 获取Android设备的唯一标识码(An

Android开发 - 获取Android设备的唯一标识码(An

作者: 罗伊德666 | 来源:发表于2018-10-17 16:39 被阅读9次

    在我们的APP开发中,通常需要获取到设备的唯一标识。在Android6.0之前,有很多方法我们可以方便获取到硬件的唯一标识,但是在Android6.0之后,Android系统大幅限制了我们获取设备的硬件信息。

    Android6.0之前的方法(已过时)

    1. DEVICE_ID
      通getSystemService(Context.TELEPHONY_SERVICE).getDeviceId()获取,但是6.0之后必须申请READ_PHONE_STATE,并且获取到的这个值在不同的厂商和设备中并不可靠。

    2. MAC地址
      这个是无线网卡的MAC地址,这个需要ACCESS_WIFI_STATE权限,并且很多情况下并获取不到这个值,也并不是十分可靠。

    3. ANDROID_ID
      这个值是当一个新的设备第一次启动时,或者恢复出厂设置时,系统会生成一个64位的数字,这个值目前(Android4.0之后)已经非常可靠,但是仍有个别厂商的定制系统的BUG,导致这个值返回null。

    获取设备唯一标识的正确姿势

    由于ANDROID_ID的值相对稳定和可靠,并且不需要申请权限,所以我们获取设备的唯一标识应该使用这个值,同时我们应该考虑到一些极端情况和安全问题。

    1. 获取ANDROID_ID
    public static String getAndroidID() {
        String id = Settings.Secure.getString(
                Utils.getApp().getContentResolver(),
                Settings.Secure.ANDROID_ID
        );
        return id == null ? "" : id;
    }
    
    1. 构造UUID,防止直接暴露ANDROID_ID
    private static String getDeviceUUid()
    {
       String androidId = DeviceUtils.getAndroidID();
       UUID deviceUuid = new UUID(androidId.hashCode(), ((long)androidId.hashCode() << 32));
       return deviceUuid.toString();
    }
    
    1. 考虑极端情况,我们自己生成一个应用级别的UUID
      这种情况我们需要将生成的UUID保存到SharedPreference中,只要应用不被卸载或者清除数据,这个值就不会变。
    private static String getAppUUid() {
       String uuid = SPUtils.getInstance().getString(PREF_KEY_UUID);
       if (TextUtils.isEmpty(uuid)) {
           uuid = UUID.randomUUID().toString();
           //这里需要保存到SharedPreference中
           ...
       }
       return uuid;
    }
    
    1. 将上面的获取方法封装到一个方法中
    public static String getUUID() {
        String uuid = getDeviceUUid();
        if (TextUtils.isEmpty(uuid)) {
            uuid = getAppUUid();
        }
        return uuid;
    }
    

    总结

    这些获取UUID方法非常简单,并且在应用的开发中可以满足99%的需求,不需要动态申请权限,也非常可靠,但是在使用时需要清楚其生成过程,以便应用到安全性要求非常高的场景中。

    如有更多疑问,请参考我的其它Android相关博客:我的博客地址

    相关文章

      网友评论

      • 楊帥:我都是直接用极光id
        楊帥:@ExampleCode 是啊,目前看用极光基本上都没啥问题
        罗伊德666:@楊帥 第三方的也可以,不过得集成极光SDK

      本文标题:Android开发 - 获取Android设备的唯一标识码(An

      本文链接:https://www.haomeiwen.com/subject/rgyrzftx.html