code小生,一个专注 Android 领域的技术平台
公众号回复 Android 加入我的安卓技术群

作者:zzj丶
链接:https://www.jianshu.com/p/997f80691999
声明:本文已获 zzj丶 授权发表,转发等请联系原作者授权

后台定位权限

AndroidQ新引入了后台定位权限,是危险权限需要代码动态申请

<!--允许App在后台获得位置信息-->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>

这个权限必须配合下面两个权限使用,单独写没有任何效果

<!--允许获得精确的GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

<!--允许获得粗略的基站网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

Google加入这个权限,意在将App是否能定位的权利分为前台和后台分别交给用户决定,减少App在后台静默定位的可能性,减少用户的个人信息的泄露。

Android Q后台定位权限的更改总而言之就是,如果项目中没有用到后台实时定位,则并无多大改动;如果涉及到后台定位,那就需要同定位权限一同去申请授权即可。

唯一标识符更改

AndroidQ对设备的系统标识增加了更多的限制和修改,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。

使用 Android 标识符的最佳做法: https://developer.android.com/training/articles/user-data-ids
一个不变和基本不重复的UUID方法:

public static String getUUID() {

String serial = null;

String m_szDevIDShort = "35" +
        Build.BOARD.length() % 10 + Build.BRAND.length() % 10 +

        Build.CPU_ABI.length() % 10 + Build.DEVICE.length() % 10 +

        Build.DISPLAY.length() % 10 + Build.HOST.length() % 10 +

        Build.ID.length() % 10 + Build.MANUFACTURER.length() % 10 +

        Build.MODEL.length() % 10 + Build.PRODUCT.length() % 10 +

        Build.TAGS.length() % 10 + Build.TYPE.length() % 10 +

        Build.USER.length() % 10//13 位

try {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        serial = android.os.Build.getSerial();
    } else {
        serial = Build.SERIAL;
    }
    //API>=9 使用serial号
    return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
catch (Exception exception) {
    //serial需要一个初始化
    serial = "serial"// 随便一个初始化
}
    //使用硬件信息拼凑出来的15位号码
    return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
}

后台Activity启动限制

AndroidQ加强了关于后台Activity的启动限制,App不可以随意的从后台拉起Activity: https://developer.android.com/preview/privacy/background-activity-starts
从 Android Q 测试版 5 开始,此项变更具有以下特性:
如果您在未与用户互动的情况下启动 Activity,则会影响您的应用
使用由通知触发的 Activity 进行缓解
通过开启允许系统执行后台活动开发者选项停用限制
该行为变更仍会在设备升级到 Android Q 后生效。

存储权限变更

  • Android Q 中删除了READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE两项危险权限,限制 App 只能使用自己的应用空间存放文件。/Android/data/

    /
  • 当 App 需要保存一些不能随卸载删除的文件时,需要根据存放位置动态申请新增的权限:READ_MEDIA_IMAGES,READ_MEDIA_VIDEO 或 READ_MEDIA_AUDIO(分别对应系统的媒体文件夹)。比较特殊的是 Downloads 文件夹:写入和读取自身写入的数据不需要申请权限,但想获取其他 App 存进去的文件时,必须使用系统的文件选择器,由用户选择。

相机和网络连接变更

访问所有相机信息都需要获得权限
Android Q 更改了 getCameraCharacteristics() 方法默认返回的信息的广度。具体而言,您的应用必须具有 CAMERA 权限才能访问此方法的返回值中可能包含的设备特定元数据。

对启用和停用 WLAN 的限制
以 Android Q 为目标平台的应用无法启用或停用 WLAN。WifiManager.setWifiEnabled() 方法始终返回 false。

如果需要,请使用设置面板提示用户启用和停用 WLAN。

WLAN 网络配置限制
为了保护用户隐私,现在只有系统应用和设备政策控制器 (DPC) 支持手动配置系统的 WLAN 网络列表。给定 DPC 可以是设备所有者或配置文件所有者。

如果您的应用不属于以上其中一个类别,而且以 Android Q 为目标平台,则下列方法将不再返回有用数据:

  • getConfiguredNetworks() 方法始终返回空列表。

  • 每个返回整数值的网络操作方法(addNetwork() 和 updateNetwork())始终返回 -1。

  • 每个返回布尔值的网络操作(removeNetwork()、reassociate()、enableNetwork()、disableNetwork()、reconnect() 和 disconnect())始终返回 false。

注意:如果运营商应用调用 getConfiguredNetworks(),系统便会返回仅包含运营商配置的网络的列表。

如果您的应用需要连接到 WLAN 网络,请使用以下备用方法:

  • 要触发与 WLAN 网络的即时本地连接,请在标准 NetworkRequest 对象中使用 WifiNetworkSpecifier。

  • 要添加 WLAN 网络以便考虑为用户提供互联网访问权限,请使用 WifiNetworkSuggestion 对象。您可以通过分别调用 addNetworkSuggestions() 和 removeNetworkSuggestions() 添加和移除在自动连接网络选择对话框中显示的网络。这些方法不需要任何位置权限。

telephony API、WLAN API 和 Bluetooth API 需要精确位置权限

除非您的应用具有 ACCESS_FINE_LOCATION 权限,否则应用在 Android Q 上运行时无法使用 WLAN API、Wi-Fi Aware API 或 Bluetooth API 中的多种方法。下面列出了受影响的方法。

注意:如果您的应用在 Android Q 上运行但以 Android 9(API 级别 28)或更低版本为目标平台,则只要您的应用具有 ACCESS_COARSE_LOCATION 或 ACCESS_FINE_LOCATION 权限,您就可以使用受影响的 API。

推荐阅读
Android P 网络请求相关总结
Android 适配之版本适配

扫一扫 关注我的公众号
如果你想要跟大家分享你的文章, 欢迎投稿~
Android 适配