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


相关文章
|
Android开发
Android 获取手机 Imei 和 DeviceId
从 Android 10 开始,应用必须具有 READ_PRIVILEGED_PHONE_STATE 特许权限才能访问设备的不可重置标识符(包含 IMEI 和序列号)。
1646 0
|
Android开发
Android笔记: 获取手机的品牌、型号、Android系统版本号、IMEI、当前系统语言等工具类
Android笔记: 获取手机的品牌、型号、Android系统版本号、IMEI、当前系统语言等工具类
607 0
|
Android开发 数据安全/隐私保护 小程序
修改Android模拟器的IMEI号
引用:http://all2h.com/?p=94 http://zhiwei.li/text/2010/10/%E4%BF%AE%E6%94%B9android-emulator%E7%9A%84imei/ 本来是搜索利用emulator -data 和-avd命令启动模拟器的区别的,却误打误撞搜索到了这个,想着以后说不定会有用因此先记录在此:) 原文:修改Android Emulator的IMEI 模拟器二进制映像(android-sdk-linux_x86/tools/emulator)没有加密 也 没有被压缩,所以明文字符串可见。
1630 0
|
7天前
|
IDE Android开发 iOS开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
【9月更文挑战第27天】在移动应用开发的世界中,Android和iOS是两个主要的操作系统平台。每个系统都有其独特的开发环境、工具和用户群体。本文将深入探讨这两个平台的关键差异点,并分析这些差异如何影响应用的性能、用户体验和最终的市场表现。通过对比分析,我们将揭示选择正确的开发平台对于确保项目成功的重要作用。
|
20天前
|
Android开发 开发者 Kotlin
探索安卓开发中的新特性
【9月更文挑战第14天】本文将引导你深入理解安卓开发领域的一些最新特性,并为你提供实用的代码示例。无论你是初学者还是经验丰富的开发者,这篇文章都会给你带来新的启示和灵感。让我们一起探索吧!
|
4天前
|
开发框架 移动开发 Android开发
安卓与iOS开发中的跨平台解决方案:Flutter入门
【9月更文挑战第30天】在移动应用开发的广阔舞台上,安卓和iOS两大操作系统各自占据半壁江山。开发者们常常面临着选择:是专注于单一平台深耕细作,还是寻找一种能够横跨两大系统的开发方案?Flutter,作为一种新兴的跨平台UI工具包,正以其现代、响应式的特点赢得开发者的青睐。本文将带你一探究竟,从Flutter的基础概念到实战应用,深入浅出地介绍这一技术的魅力所在。
21 7
|
7天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台解决方案
【9月更文挑战第27天】在移动应用开发的广阔天地中,安卓和iOS两大操作系统如同双子星座般耀眼。开发者们在这两大平台上追逐着创新的梦想,却也面临着选择的难题。如何在保持高效的同时,实现跨平台的开发?本文将带你探索跨平台开发的魅力所在,揭示其背后的技术原理,并通过实际案例展示其应用场景。无论你是安卓的忠实拥趸,还是iOS的狂热粉丝,这篇文章都将为你打开一扇通往跨平台开发新世界的大门。
下一篇
无影云桌面