Android 抛弃IMEI改用ANDROID_ID

简介: 介绍之前一直使用IMEI作为唯一标识符,缺点就是需要权限:Android 10以前,需要READ_PHONE_STATE权限Android 10限制,需要READ_PRIVILEGED_PHONE_STATE权限 国内因为各大应用获取权限过多,所以对这里不是很重视,但是如果需要发布到国外如 Google Play 等。那么这些权限将给你带来麻烦,他们对隐私很看重,有些人不在乎,但是有一部分人看到你获取这么敏感的权限会直接卸载,更严重的他们会直接举报。所以权限方面如果发布国外就需要注意了。 那么我们能不能在不使用权限的情况下获取到设备的唯一标识符?

介绍


之前一直使用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)

微信图片_20220525140922.png


Java 获取方式


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

微信图片_20220525140950.png


Android OAID


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


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

微信图片_20220525141016.png


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


百度-Android OAID 接入


华为-OAID


相关文章
|
29天前
|
安全 Shell 测试技术
安卓硬改一键新机,一键新机改串软件,免ROOT网卡串号Imei/sn码
本内容提供移动安全研究相关资料与方法,包括通过Android Studio官方工具和模拟器进行设备测试、ADB调试命令学习
|
Android开发
Android 获取手机 Imei 和 DeviceId
从 Android 10 开始,应用必须具有 READ_PRIVILEGED_PHONE_STATE 特许权限才能访问设备的不可重置标识符(包含 IMEI 和序列号)。
2011 0
|
Android开发
Android笔记: 获取手机的品牌、型号、Android系统版本号、IMEI、当前系统语言等工具类
Android笔记: 获取手机的品牌、型号、Android系统版本号、IMEI、当前系统语言等工具类
783 0
|
4天前
|
安全 数据库 Android开发
在Android开发中实现两个Intent跳转及数据交换的方法
总结上述内容,在Android开发中,Intent不仅是活动跳转的桥梁,也是两个活动之间进行数据交换的媒介。运用Intent传递数据时需注意数据类型、传输大小限制以及安全性问题的处理,以确保应用的健壯性和安全性。
40 11
|
1月前
|
安全 Java Android开发
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
78 0
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
|
4月前
|
JavaScript Linux 网络安全
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
801 76
|
5月前
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
318 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问