谷歌的Android Q到底有哪些新特性及变动?

Android Q 隐私更改相关介绍

存储范围变动

Android Q 改变了应用程序访问设备外部存储上文件的方式。 经过使用更细粒度的媒体特定权限替换之前的 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE权限。android

外存中私有目录权限变动

Android Q 为每一个应用程序提供了一个独立的在外部存储设备的存储沙箱,没有其余应用能够直接访问您应用的沙盒文件。因为文件是私有的,所以访问这些文件再也不须要任何权限。 而且 Android Q 推荐了获取外部存储私有文件的最佳位置:即Context.getExternalFilesDir()返回的位置,由于此位置在全部Android版本中表现一致。使用此方法时,请传入与要建立或打开的文件类型对应的媒体环境。例如,要访问或保存app-private图像,请调用Context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)。程序员

公共媒体集合特性
  1. 定义公共媒体集合:Photos & Videos、Music、 Downloads。面试

  2. APP 无需请求任何权限便可在这些共享集合中建立和修改本身的文件。安全

  3. 若是你的APP想建立和修改其余应用已建立的文件,则必须首先请求相应的权限:bash

访问Photos & Videos目录的其余应用程序文件 须要请求 READ_MEDIA_IMAGES 或 READ_MEDIA_VIDEO 权限,具体取决于您的应用程序须要访问的文件类型。网络

访问 Music 共享集合中的其余应用程序文件须要 READ_MEDIA_AUDIO 权限。app

没有访问Downloads共享集合的权限,您的应用能够访问此集合中本身的文件。可是,要访问此集合中的其余应用程序文件,您必须容许用户使用系统的文件选择器应用程序选择文件。dom

访问共享集合

访问共享集合经过 MediaStore API ,如 MediaStore.Images、MediaStore.Video、MediaStore.Audio、MediaStore.Downloads。编辑器

须要注意的是:对于 Android Q 上新安装的应用,对 getExternalStoragePublicDirectory()的调用仅提供对应用已存储在其隔离存储沙箱中的文件的访问权限。要保持对其余应用程序文件的访问权限,请更新应用程序的逻辑以使用MediaStore。ide

新增 ACCESS_MEDIA_LOCATION 权限

一些照片在其数据中会包含位置信息,容许用户查看拍摄照片的位置。因为此位置信息是敏感的,所以咱们想获取位置信息须要如下几步:

  1. 将新的 ACCESS_MEDIA_LOCATION 权限添加到AndroidManifest。

  2. 获取位置信息

photoUri = MediaStore.setRequireOriginal(photoUri);
InputStream stream = getContentResolver().openInputStream(photoUri);
//从流中读取位置信息

复制代码
存储新特性兼容

target API 级别等于 Android Q 的应用,或者在运行Android Q 的设备上新安装的应用默认都会采起新的权限策略 若是你的APP同时知足如下两个条件,则会兼容之前的权限策略:

  1. targetSdkVersion <= Android 9
  2. 你的应用安装在从 Android 9 升级到 Android Q 的设备上
识别特定的外部存储设备

Android Q 为每一个外部存储设备提供惟一的卷名。

//获取卷名方式
Set<String> volumeNames = MediaStore.getAllVolumeNames(context);

复制代码

Activity后台活动限制

Android Q 对应用未经通知用户就启动进行了极大地限制,在Android Q上运行的应用只有在知足如下一个或多个条件时才能启动活动:

  1. 该APP具备可见窗口,例若有前台Activity
  2. 位于前台的另外一个 APP 发送属于该应用程序的 PendingIntent。
  3. 系统发送属于该 APP 的PendingIntent,例如点击通知。
  4. 系统向应用程序发送广播,例如SECRET_CODE_ACTION。只有应用程序预期启动UI的特定广播才免除。
活动限制的兼容性

此行为更改适用于在 Android Q 上运行的全部应用,甚至是针对Android 9(API级别28)或更低级别的应用。可是,只要您的应用以用户互动的直接结果开始活动,您的应用极可能不会受到此更改的影响。实际上,大多数应用程序都不受此更改的影响。

此外,Android Q 建议咱们 后台应用程序都应建立通知,以便向用户提供信息,而不是直接启动活动。

一些特殊状况如:来电或者警报,须要马上启动 Activity,则能够经过建立高优先级的通知,并提供 fullscreen itent。如何建立高优先级通知?

设备位置权限的访问控制

用户能够更好地控制应用什么时候能够访问设备位置。当在Android Q上运行的应用程序请求位置访问时,会经过对话框的形式给用户进行受权提示。此对话框容许用户授予对两个不一样范围的位置访问权限:在使用中(仅限前台)或始终(前台和后台)。

新增权限 ACCESS_BACKGROUND_LOCATION

若是你的应用针对 Android Q 而且须要在后台运行时访问用户的位置,则必须在应用的清单文件中声明新权限

<manifest>
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
</manifest>

复制代码
位置限制的兼容性

若是您的应用在 Android Q 上运行但针对的是 Android 9(API级别28)或更低版本,则会出现如下行为:

  1. 若是你的应用为 ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION 声明 标记,则系统会在安装期间自动为ACCESS_BACKGROUND_LOCATION 添加 标记。
  2. 若是你的应用请求 ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION,系统会自动将 ACCESS_BACKGROUND_LOCATION添加到请求中。
  3. 虽然你的应用能够请求并接收 ACCESS_BACKGROUND_LOCATION,但用户能够经过选择您的应用仅应在前台访问位置信息来撤消此权限。

对数据和标识符的更改

影响在Android Q 上运行的全部应用的更改:

联系人亲缘关系

从Android Q开始,该平台再也不跟踪联系人亲缘关系信息。所以,若是您的应用对用户的联系人进行搜索,则结果再也不按交互频率排序。 “联系人提供程序”指南包含一个通知,说明自Android Q起全部设备上已废弃的特定字段和方法。

MAC地址随机化

在Android Q 运行的设备默认传输随机的MAC 地址,获取随机MAC地址API:WifiConfiguration.getRandomizedMacAddress() 获取实际硬件MAC地址:WifiInfo.getFactoryMacAddress()。

惟一标识符

应用必须具备 READ_PRIVILEGED_PHONE_STATE 特权权限才能访问设备的不可重置标识符,包括IMEI和序列号。原则上 Android Q 建议避免使用更容易关联到我的的硬件标识符,而是使用实例ID。实例ID的作法推荐

访问剪贴板数据

除非您的应用程序是默认输入法编辑器或当前具备焦点的应用程序,不然您的应用程序没法访问剪贴板数据。

影响针对 Android Q API 级别运行的应用的更改:

访问USB串行须要用户许可

若是您的应用针对Android Q,则您的应用只能在用户授予您访问USB设备或配件的应用权限后才能读取序列号。

相机和链接相关更改

影响在Android Q 上运行的全部应用的更改:

访问相机信息须要得到许可

Android Q更改了默认状况下getCameraCharacteristics()方法返回的信息的广度。特别是,您的应用必须具备CAMERA权限才能访问此方法的返回值中包含的潜在设备特定元数据。

启用和禁用Wi-Fi的限制

在Android Q上运行的应用没法启用或停用Wi-Fi。 WifiManager.setWifiEnabled()方法始终返回false。 若是须要,请使用设置面板提示用户启用和禁用Wi-Fi。

影响针对 Android Q API 级别运行的应用的更改:

电话,Wi-Fi,蓝牙API所需的精确位置许可

除非您的应用具备ACCESS_FINE_LOCATION权限,不然在Android Q上运行时,您的应用没法在Wi-Fi,Wi-Fi Aware或蓝牙API中使用多种方法。要查看受影响方法的列表,请参阅隐私附录。

Wi-Fi网络配置限制

将Wi-Fi网络列表的手动配置限制在系统应用程序中。若是您的应用针对Android Q,则如下方法再也不返回有用数据,下面方法将不会返回有效信息:

  • getConfiguredNetworks()方法始终返回空List
  • addNetwork()和updateNetwork() - 始终返回-1
  • 返回布尔值的每一个网络操做 - removeNetwork(),reassociate(),enableNetwork(),disableNetwork(),reconnect()和disconnect() - 始终返回false

物理活动识别

针对 Android Q API 级别运行的应用,Android Q为须要检测用户移动的应用程序(例如步行,骑自行车或车辆)引入了新的ACTIVITY_RECOGNITION运行时权限。这旨在让用户了解设置中如何使用设备传感器数据。

Android Q 行为变动

最令咱们关心的,仍是咱们的适配工做。下面,分两部分讲:

1、针对全部运行在 Android Q 上的app的行为变动

非SDK接口限制更新(Non-SDK interface restrictions):

为了确保应用稳定性和兼容性,Google 在 Android O 中开始限制使用哪些非SDK接口(API级别28)。 Android Q 更新了非SDK接口的限制列表,而且修改了限制规则。

1.灰名单修改:在Android 9(API级别28)中,灰名单分为如下两个列表:

(1)lightgrey列表: targetSdkVersion<28 状况下可使用的非SDK接口

(2)darkgrey list:targetSdkVersion>=28 状况下没法使用的非SDK接口

在 Android Q 中,咱们如今将这两个列表统称为 greylist(灰名单),可是受目标API级别限制: 如在 Android P 中被限制的黑灰色名单:darkgrey list 如今叫作 greylist-max-o, 在 Android Q 中被限制的非SDK接口应该称为 greylist-max-p

2.代码注释修改:引入如下注解来区别哪些非SDK接口在哪一个API作了限制 @UnsupportedAppUsge 无限制的灰名单 @UnsupportedAppUsage(maxTargetSdk = 0) 黑名单,哪一个API都不能调用 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.O) API <= Android O 能够调用 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) API <= Android P 能够调用 Android Q 非SDK接口限制列表过长,这里直接附上查询地址

WIFI P2P 广播(Wi-Fi Direct broadcasts):

在 Android Q 上,与 Wi-Fi Direct 功能相关的广播再也不具备粘性。若是你的 APP 依赖于在注册时接收这些广播,能够在初始化时使用适当的get()方法来获取信息,具体可参考 WifiP2pManager 类相关方法。

SYSTEM_ALERT_WINDOW 权限在 Android Go 设备变动

在Android Q(Go版)设备上运行的应用没法接收SYSTEM_ALERT_WINDOW权限。这是由于绘制叠加窗口使用过多的内存,这对低内存Android设备的性能特别有害。

2、针对API级别为 Android Q 的行为变动

若是你的应用将targetSdkVersion设置为“android-Q”或更高版本,则下面的你须要注意了。

灰名单变动

灰名单变动参考“针对全部运行在 Android Q 上的app的行为变动”的策略,意味着@UnsupportedAppUsage(maxTargetSdk < Build.VERSION_CODES.Q) 的非API方法你都须要注意了!!!

共享内存

针对Q的应用不能再直接使用ashmem(/ dev / ashmem),而必须经过NDK的ASharedMemory类访问共享内存。此外,应用程序没法直接对现有的ashmem文件描述符进行IOCTL,而必须使用NDK的ASharedMemory类或Android Java API来建立共享内存区域。在使用共享内存时,此更改可提升安全性和稳健性,从而提升Android总体的性能和安全性。

Android runtime only accepts system-generated OAT files

Android运行时(ART)再也不从应用程序进程调用dex2oat。此更改意味着ART将仅接受系统生成的OAT文件。

Permissions changes for fullscreen intents

使用全屏Intent通知的应用必须在其应用的 Manifest 文件中请求 USE_FULL_SCREEN_INTENT 权限,这是正常权限,所以系统会自动授予。 若是针对Android Q或更高版本的应用尝试在不请求USE_FULL_SCREEN_INTENT权限的状况下建立具备全屏的Intent,系统将忽略全屏意图。

阅读更多

程序员接私活经验总结

(Android)面试题级答案(精选版)

还在期待安卓9.0吗?Android 10.0要来了

阿里内部的那个牛逼带闪电的Java诊断工具终于开源了

锤子科技"临死前"被"接盘",内部人士爆料已改签今日头条母公司

相信本身,没有作不到的,只有想不到的

相关文章
相关标签/搜索