Android 抛弃IMEI改用ANDROID_ID

介绍

之前一直使用IMEI作为唯一标识符,缺点就是需要权限:

  • Android 10以前,需要READ_PHONE_STATE权限

  • Android 10限制,需要READ_PRIVILEGED_PHONE_STATE权限

        国内因为各大应用获取权限过多,所以对这里不是很重视,但是如果需要发布到国外如 Google Play 等。那么这些权限将给你带来麻烦,他们对隐私很看重,有些人不在乎,但是有一部分人看到你获取这么敏感的权限会直接卸载,更严重的他们会直接举报。所以权限方面如果发布国外就需要注意了。

        那么我们能不能在不使用权限的情况下获取到设备的唯一标识符?

  • ANDROID_ID(系统自带)。

  • Android OAID(三方SDK提供)。

  • 使用Mac地址

        使用Mac地址,需要ACCESS_WIFI_STATE权限,不同版本获取方式不同需要处理,这里就不介绍了。咱这重点看看 Android ID。

Android 10 对不可重置设备标识符的限制

        从 Android 10 开始,应用必须具有 READ_PRIVILEGED_PHONE_STATE 特权权限才能访问设备的不可重置标识符,其中包括 IMEI 和序列号

注意:从 Google Play 商店安装的第三方应用程序不能声明特权权限

受影响的方法包括:

  • Build
    • getSerial()

  • TelephonyManager
    • getImei()

    • getDeviceId()

    • getMeid()

    • getSimSerialNumber()

    • getSubscriberId()

因此梦想就此破灭了。

ANDROID_ID

        用户首次设置设备时随机生成的64位数字(表示为十六进制字符串),对于应用签名密钥、用户和设备每个组合都是唯一的。 ANDROID_ID 的值由签名密钥和用户限定。如果在设备上执行恢复出厂设置APK 签名密钥更改,则该值可能会更改

一句话:ANDROID_ID是设备的系统首次启动生成的一串字符,基本可以保证唯一性。但是root、刷机或恢复出厂设置都会导致设备的ANDROID_ID重置。

获取方式

public final class Settings {
    ...
    public static final class Secure extends Settings.NameValueTable {
        ...
        public static final String ANDROID_ID = "android_id";
    }
}
    

Kotlin 获取方式

    var id= Settings.Secure.getString(this.contentResolver,Settings.Secure.ANDROID_ID);
    Log.e("Android ID-Kt",id)

Java 获取方式

    String id= Settings.Secure.getString(this.getContentResolver(),Settings.Secure.ANDROID_ID);
    Log.e("Android ID-Java",id);

Android OAID

        因传统的移动终端设备标识如国际移动设备识别码(IMEI)等已被部分国家认定为用户隐私的一部分,并存在被篡改和冒用的风险,所以在Android 10及后续版本中非厂商系统应用将无法获取IMEI、MAC等设备信息。无法获取IMEI会在用户行为统计过程中对设备识别产生一定影响。

        近日移动安全联盟针对该问题联合国内手机厂商推出补充设备标准体系方案,选择OAID字段作为IMEI等的替代字段。OAID字段是由中国信通院联合华为、小米、OPPO、VIVO等厂商共同推出的设备识别字段,具有一定的权威性,可满足用户行为统计的使用场景。

移动安全联盟官网- 移动智能设备标识公共服务平台

百度-Android OAID 接入

华为-OAID

猜你喜欢

转载自blog.csdn.net/g984160547/article/details/122858595