前言
AndroidQ对设备的系统标识增加了更多的限制和修改,那么让我们来看一下,在AndroidQ的上的改动和适配方法。
MAC地址
默认情况下,搭载 Android Q 的设备会传输随机选择的 MAC 地址。如果您的应用处理企业用例,平台会提供几个新的 API:
-
获取随机选择的 MAC 地址:设备所有者应用和个人资料所有者应用可以通过调用
WifiConfiguration.getRandomizedMacAddress()
检索分配给特定网络的随机选择 MAC 地址。这个方法返回的mac地址永远为02:00:00:00:00:00,所以这个接口没有什么实际意义。 -
获取实际的出厂 MAC 地址:设备所有者应用可以通过调用
WifiInfo.getFactoryMacAddress()
检索设备的实际硬件 MAC 地址。此方法对于跟踪设备队列非常有用。这方法目前在AndroidQ beta2中并未实装到SDK,无法调用。原因不明,但是官方文档里确实说了这个方法。
不可重置的设备标识符
AndroidQ将彻底禁止第三方应用获取设备的imei序列号,无论你是以target多少版本编译的应用,都不能在AndroidQ的设备上获得设备标识符。所以如果你只是想得到唯一标识符,请不要再加入READ_PHONE_STATE权限,不会生效。
如果你的应用可以加入系统级应用,那么你需要加入权限
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission. READ_PRIVILEGED_PHONE_STATE"/>
READ_PRIVILEGED_PHONE_STATE为系统级别权限,第三方应用加入无效。
如果依然使用获取imel相关的代码时
- 如果应用以 Android Q 为目标平台,则会发生
SecurityException
。 - 如果应用以 Android 9(API 级别 28)或更低版本为目标平台,则相应方法会返回
null
或占位符数据(如果应用具有READ_PHONE_STATE
权限)。否则,会发生SecurityException
。
那我们应该如何来正确获取一个唯一识别码呢?
其实Google很久以前就专门写文档说明过这个问题唯一识别符的最佳做法
这里如果后台只是想要一个唯一识别符,那么我们最适合的选择应该是UUID,UUID每次请求都会重新生成,所以我们申请一个UUID后,用sp把他存储起来。这样只要我们的App没有被删除,这个UUID将永远唯一的存在。我知道这里有的同学会把UUID直接存到sd卡里,这样就算卸载了App依然可以保证UUID是存在的,不过我们都知道AndroidQ对IO进行了修改,你这么做不合适了已经。
UUID.randomUUID().toString()
得到一个唯一的识别符,保存起来就可以了。
访问剪贴板数据
除非您的应用是默认输入法 (IME) 或是目前处于焦点的应用,否则应用无法访问剪贴板数据。
这句话的意思其实就是,你的App不再可以在不可见也就是后台状态下访问剪贴板,具体没有适配方法,请遵守Google的开发要求。
以下变更仅会影响以 Android Q 为目标平台的应用。
访问 USB 串行设备需要用户授予权限
如果您的应用以 Android Q 为目标平台,则该应用只能在用户授予其访问 USB 设备或配件的权限后才能读取序列号。
后记
唯一识别符的改动和适配还是比较容易理解的,我现在唯一想知道的是那些第三方的推送平台,没有了读取设备id的权限以后要怎么正确的完成推送动作。不过这也不是我该想的事。
- Github: https://github.com/liyuhaolol
- 博客: http://blog.csdn.net/ccffvii
- 简书: https://www.jianshu.com/u/a305fae6394f
- 邮箱: liyuhaoid@sina.com
如果看不懂或者我写的有问题的地方,欢迎在评论中指出,大家一切探究讨论!