Android Q适配(3)-------唯一标识符篇

前言

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的权限以后要怎么正确的完成推送动作。不过这也不是我该想的事。

如果看不懂或者我写的有问题的地方,欢迎在评论中指出,大家一切探究讨论!

    原文作者:飞吧小蚊子
    原文地址: https://www.jianshu.com/p/6edf386ba626
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞