zoukankan      html  css  js  c++  java
  • Android开发

    在我们的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相关博客:我的博客地址

  • 相关阅读:
    mysql索引
    mysql事务
    MySQL注入问题
    【CUDA并行编程之四】矩阵相乘
    【CUDA并行编程之三】Cuda矢量求和运算
    【Cuda并行编程之二】Cuda Memory Hierarchy_Cuda内存层次结构
    【Cuda并行编程之一】二分查找的探究以及Cuda的简单实现&&相关面试题介绍
    CUDA编程接口:共享存储器实现矩阵相乘
    CUDA学习
    CUDA从入门到精通
  • 原文地址:https://www.cnblogs.com/lloyd-zh/p/9805088.html
Copyright © 2011-2022 走看看