目录
- 隐私权
- 权限变更
- 外部存储访问权限变更
- 限制对屏幕内容的访问
- 面向用户的权限检查(针对旧版应用)
- 身体活动识别
- 从界面中移除了权限组
- 用户可控制应用对设备位置信息的访问权限
- 在后台访问设备位置信息需要申请权限
- 请求后台位置信息访问权限
- 数据和标识符变更
- 联系人亲密程度
- 随机选择的 MAC 地址
- 访问 /proc/net 文件系统
- 不可重置的设备标识符
- 访问剪贴板数据
- 访问 USB 串行设备需要用户授予权限
- 隐私核对清单
- 相机和网络连接变更
- 访问所有相机信息都需要获得权限
- 影响以 Android Q 为目标平台的应用的变更
- 对启用和停用 WLAN 的限制
- WLAN 网络配置限制
- telephony API、WLAN API 和 Bluetooth API 需要精确位置权限
- 深色主题背景
- 在应用中支持深色主题背景
- 主题背景和样式
- 更改应用内主题背景
- Force Dark
- 在视图上停用 Force Dark
- 要检查当前采用的是哪种主题背景,应用可以运行如下代码:
隐私权
权限变更
外部存储访问权限变更
访问特定路径外部存储不需要额外申请权限
- app路径下的目录可以使用API getExternalFilesDir()
- app在媒体商店创建(MediaStore)的照片、音频和视频
限制对屏幕内容的访问
为了保护用户的屏幕内容,Android Q 更改了 READ_FRAME_BUFFER、CAPTURE_VIDEO_OUTPUT 和CAPTURE_SECURE_VIDEO_OUTPUT 权限的作用域,使其只能通过签名访问,从而禁止以静默方式访问设备的屏幕内容。
需要访问设备屏幕内容的应用应使用 MediaProjection
API,此 API 会显示提示,要求用户同意声明。
面向用户的权限检查(针对旧版应用)
如果您的应用以 Android 5.1(API 级别 22)或更低版本为目标平台,则当用户首次在 Android Q 上运行该应用时,他们会看到一个权限屏幕此屏幕可以让用户撤消系统先前在安装时授予您应用的访问权限。
身体活动识别
Android Q 针对需要检测用户步数或对用户的身体活动(例如步行、骑车或坐车)进行分类的应用引入了一个新的 ACTIVITY_RECOGNITION
运行时权限。此项权限旨在让用户了解设备传感器数据在“设置”中的使用方式。
如果您的应用依赖于设备上其他内置传感器的数据,例如加速度计和陀螺仪,则无需在应用中声明此新权限。
如果您的应用以 Android 9(API 级别 28)或更低版本为目标平台,并在其清单文件中指定com.google.android.gms.permission.ACTIVITY_RECOGNITION 权限,则系统会根据需要自动向您的应用授予此权限。当您将应用更新为以 Android Q 为目标平台时,平台会保留此权限;不过,由于一个已知的平台问题,此权限会在更新时重置。此外,用户可以随时在系统设置中撤消此权限。
从界面中移除了权限组
从 Android Q 开始,应用无法在界面中查询权限的分组方式。
用户可控制应用对设备位置信息的访问权限
在后台访问设备位置信息需要申请权限
引入新的权限ACCESS_BACKGROUND_LOCATION
- 如果您的应用以 Android Q 为目标平台,并且在后台运行时需要访问设备的位置信息,则您必须在应用的清单文件中声明新权限
- 如果您的应用在 Android Q 上运行但目标平台是 Android 9(API 级别 28)或更低版本,则以下行为适用:
- 如果您的应用为 ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION 声明了 元素,则系统会在安装期间自动为 ACCESS_BACKGROUND_LOCATION 添加 元素。
- 如果您的应用请求了 ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION,系统会自动将 ACCESS_BACKGROUND_LOCATION 添加到请求中。
Link
请求后台位置信息访问权限
如果应用的用例需要在后台运行时访问位置信息,请务必考虑您需要此权限的范围:
- 应用的用例依赖于延续用户发起的操作,例如导航或智能家居操作。在这种情况下,请配置前台服务,以便在用户按下设备上的主屏幕按钮或关闭设备显示屏后,该服务可保留对设备位置信息的访问权限,即使用户已要求您的应用只能在前台访问设备位置信息,也是如此。
- 应用的用例始终依赖于定期查看设备位置信息,例如地理围栏或位置信息分享。在这种情况下,应用应向用户说明他们需要允许该应用始终都能访问设备位置信息,以确保正常运行,然后请求在后台访问位置信息。
数据和标识符变更
联系人亲密程度
从 Android Q 开始,平台不再跟踪联系人亲密程度信息。因此,如果您的应用对用户的联系人进行搜索,则系统将不再按互动频率对搜索结果排序。
随机选择的 MAC 地址
默认情况下,搭载 Android Q 的设备会传输随机选择的 MAC 地址。如果您的应用处理企业用例,平台会提供几个新的 API:
获取随机分配的 MAC 地址:设备所有者应用和配置文件所有者应用可以通过调用 getRandomizedMacAddress()
检索分配给特定网络的随机 MAC 地址。
获取实际的出厂 MAC 地址:设备所有者应用可以通过调用 getWifiMacAddress()
检索设备的实际硬件 MAC 地址。此方法对于跟踪设备队列非常有用。
访问 /proc/net 文件系统
Android Q 撤消了 /proc/net 访问权限,其中包含有关设备网络状态的信息。需要访问此信息的应用(如 VPN)应引用 NetworkStatsManager 和 ConnectivityManager 类。
不可重置的设备标识符
从 Android Q 开始,应用必须具有 READ_PRIVILEGED_PHONE_STATE
特许权限才能访问设备的不可重置标识符(包含 IMEI 和序列号)。许多用例不需要不可重置的设备标识符。如果您的应用没有该权限,但您仍尝试查询标识符的相关信息,则平台的响应会因目标 SDK 版本而异:
如果应用以 Android Q 为目标平台,则会发生 SecurityException。
如果应用以 Android 9(API 级别 28)或更低版本为目标平台,则相应方法会返回 null 或占位符数据(如果应用具有 READ_PHONE_STATE 权限)。否则,会发生 SecurityException。
访问剪贴板数据
除非您的应用是默认输入法 (IME) 或是目前处于焦点的应用,否则应用无法访问剪贴板数据。
访问 USB 串行设备需要用户授予权限
如果您的应用 以 Android Q 为目标平台,则该应用只能在用户授予其访问 USB 设备或配件的权限后才能读取序列号。
Link
隐私核对清单
Link
相机和网络连接变更
访问所有相机信息都需要获得权限
Android Q 更改了 getCameraCharacteristics() 方法默认返回的信息的广度。具体而言,您的应用必须具有 CAMERA 权限才能访问此方法的返回值中可能包含的设备特定元数据。
如果您的应用没有 CAMERA 权限,它将无法访问以下字段:
- ANDROID_LENS_POSE_ROTATION
- ANDROID_LENS_POSE_TRANSLATION
- ANDROID_LENS_INTRINSIC_CALIBRATION
- ANDROID_LENS_RADIAL_DISTORTION
- ANDROID_LENS_POSE_REFERENCE
- ANDROID_LENS_DISTORTION
- ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE
- ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE
- ANDROID_SENSOR_REFERENCE_ILLUMINANT1
- ANDROID_SENSOR_REFERENCE_ILLUMINANT2
- ANDROID_SENSOR_CALIBRATION_TRANSFORM1
- ANDROID_SENSOR_CALIBRATION_TRANSFORM2
- ANDROID_SENSOR_COLOR_TRANSFORM1
- ANDROID_SENSOR_COLOR_TRANSFORM2
- ANDROID_SENSOR_FORWARD_MATRIX1
- ANDROID_SENSOR_FORWARD_MATRIX2
影响以 Android Q 为目标平台的应用的变更
以下变更仅会影响以 Android Q 为目标平台的应用。
对启用和停用 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。
如果您的应用需要连接到 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 中的多种方法。
Telephony
- TelephonyManager
– getCellLocation()
– getAllCellInfo()
– requestNetworkScan()
– requestCellInfoUpdate()
– getAvailableNetworks()
– getServiceStateForSubscriber
– getServiceState() - TelephonyScanManager
– requestNetworkScan() - TelephonyScanManager.NetworkScanCallback
– onResults() - PhoneStateListener
– onCellLocationChanged()
– onCellInfoChanged()
– onServiceStateChanged()
WLAN - WifiManager
– startScan()
– getScanResults()
– getConnectionInfo()
– getConfiguredNetworks() - WifiAwareManager
- WifiP2pManager
- WifiRttManager
Bluetooth - BluetoothAdapter
– startDiscovery()
– startLeScan()
– LeScanCallback()
深色主题背景
深色主题背景具有诸多优势:
- 可以大幅减少耗电量(具体取决于设备的屏幕技术)。
- 改善弱视以及对强光敏感的用户的可视性。
- 让所有人都可以在光线较暗的环境中更轻松地使用设备。
在 Android Q 中,可以通过以下三种方法启用深色主题背景:
- 用户可以通过新的系统设置(设置 -> 显示 -> 主题背景)启用深色主题背景。
- 用户可以通过新的“快捷设置”图块从通知栏中快速切换主题背景(启用此主题背景后)。
- 在 Pixel 设备上,启用省电模式的同时也会启用深色主题背景。其他 OEM 不一定支持这种行为
在应用中支持深色主题背景
要支持深色主题背景,您必须将应用的主题背景(通常可在 res/values/styles.xml 下找到)设置为继承 DayNight 主题背景:
<style name="AppTheme" parent="Theme.AppCompat.DayNight">
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
这会将应用的主要主题背景与系统控制的夜间模式标记关联起来,并将应用的默认主题背景设置为深色主题背景(如果已启用)。
主题背景和样式
主题背景和样式应该避免使用适合在浅色主题背景下使用的硬编码颜色或图标。您应该使用主题背景属性(首选)或适合在夜间使用的资源。
以下是需要了解的两个最重要的主题背景属性:
- ?android:attr/textColorPrimary:一种通用型文字颜色。它在浅色主题背景下接近于黑色,在深色主题背景下接近于白色。包含一个停用状态。
- ?attr/colorControlNormal:一种通用型图标颜色。包含一个停用状态。
我们建议使用 Material Design 组件,因为通过它的颜色主题背景系统(例如主题背景属性 ?attr/colorSurface 和 ?attr/colorOnSurface),可以轻松获取合适的颜色。当然,您可以在主题背景中自定义这些属性。
更改应用内主题背景
您可能希望允许用户在应用运行时更改其主题背景。应用可以让用户选择使用不同的主题背景。
应用在搭载 Android 9 或更低版本的设备上运行时,推荐的主题背景选项是:
- 浅色
- 深色
- 由省电模式设置(推荐的默认选项)
应用在搭载 Android Q 的设备上运行时,推荐的选项有所不同,允许用户覆盖系统默认设置:
- 浅色
- 深色
- 系统默认设置(推荐的默认选项)
请注意,如果用户选择“浅色”,省电模式不会更改该设置。
每个选项直接映射到以下某个 AppCompat.DayNight 模式:
- 浅色 - MODE_NIGHT_NO
- 深色 - MODE_NIGHT_YES
- 由省电模式设置 - MODE_NIGHT_AUTO_BATTERY
- 系统默认 - MODE_NIGHT_FOLLOW_SYSTEM
要切换主题背景,请调用 AppCompatDelegate.setDefaultNightMode()
。
Force Dark
Android Q 提供 Force Dark 功能,此功能可让开发者快速实现深色主题背景,而无需明确设置 DayNight 主题背景,如上所述。
Force Dark 会分析您采用浅色主题背景的应用的各个视图,并在相应视图在屏幕上显示之前,自动应用深色主题背景。一些开发者会混合使用 Force Dark 和本机实现,以缩短实现深色主题背景所需的时间。
应用必须在其主题背景中设置 android:forceDarkAllowed=“true”,才能选择启用 Force Dark。此属性会在所有系统和 AndroidX 提供的浅色主题背景(例如 Theme.Material.Light)上设置。当您使用 Force Dark 时,应该确保全面测试应用,并根据需要排除视图。
如果您的应用使用深色主题背景(例如 Theme.Material),则系统不会应用 Force Dark。同样,如果应用的主题背景继承自 DayNight 主题背景,系统也不会应用 Force Dark,因为会自动切换主题背景。
在视图上停用 Force Dark
您可以通过 android:forceDarkAllowed
布局属性或 setForceDarkAllowed()
在具体视图上控制 Force Dark。
要检查当前采用的是哪种主题背景,应用可以运行如下代码:
int currentNightMode = configuration.uiMode & Configuration.UI_MODE_NIGHT_MASK;
switch (currentNightMode) {
case Configuration.UI_MODE_NIGHT_NO:
// Night mode is not active, we're using the light theme
break;
case Configuration.UI_MODE_NIGHT_YES:
// Night mode is active, we're using dark theme
break;
}