Android Q 改变了应用程序访问设备外部存储上文件的方式。 经过使用更细粒度的媒体特定权限替换之前的 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE权限。android
Android Q 为每一个应用程序提供了一个独立的在外部存储设备的存储沙箱,没有其余应用能够直接访问您应用的沙盒文件。因为文件是私有的,所以访问这些文件再也不须要任何权限。 而且 Android Q 推荐了获取外部存储私有文件的最佳位置:即Context.getExternalFilesDir()返回的位置,由于此位置在全部Android版本中表现一致。使用此方法时,请传入与要建立或打开的文件类型对应的媒体环境。例如,要访问或保存app-private图像,请调用Context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)。程序员
定义公共媒体集合:Photos & Videos、Music、 Downloads。面试
APP 无需请求任何权限便可在这些共享集合中建立和修改本身的文件。安全
若是你的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 权限添加到AndroidManifest。
获取位置信息
photoUri = MediaStore.setRequireOriginal(photoUri);
InputStream stream = getContentResolver().openInputStream(photoUri);
//从流中读取位置信息
复制代码
target API 级别等于 Android Q 的应用,或者在运行Android Q 的设备上新安装的应用默认都会采起新的权限策略 若是你的APP同时知足如下两个条件,则会兼容之前的权限策略:
Android Q 为每一个外部存储设备提供惟一的卷名。
//获取卷名方式
Set<String> volumeNames = MediaStore.getAllVolumeNames(context);
复制代码
Android Q 对应用未经通知用户就启动进行了极大地限制,在Android Q上运行的应用只有在知足如下一个或多个条件时才能启动活动:
此行为更改适用于在 Android Q 上运行的全部应用,甚至是针对Android 9(API级别28)或更低级别的应用。可是,只要您的应用以用户互动的直接结果开始活动,您的应用极可能不会受到此更改的影响。实际上,大多数应用程序都不受此更改的影响。
此外,Android Q 建议咱们 后台应用程序都应建立通知,以便向用户提供信息,而不是直接启动活动。
一些特殊状况如:来电或者警报,须要马上启动 Activity,则能够经过建立高优先级的通知,并提供 fullscreen itent。如何建立高优先级通知?
用户能够更好地控制应用什么时候能够访问设备位置。当在Android Q上运行的应用程序请求位置访问时,会经过对话框的形式给用户进行受权提示。此对话框容许用户授予对两个不一样范围的位置访问权限:在使用中(仅限前台)或始终(前台和后台)。
若是你的应用针对 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)或更低版本,则会出现如下行为:
影响在Android Q 上运行的全部应用的更改:
从Android Q开始,该平台再也不跟踪联系人亲缘关系信息。所以,若是您的应用对用户的联系人进行搜索,则结果再也不按交互频率排序。 “联系人提供程序”指南包含一个通知,说明自Android Q起全部设备上已废弃的特定字段和方法。
在Android Q 运行的设备默认传输随机的MAC 地址,获取随机MAC地址API:WifiConfiguration.getRandomizedMacAddress() 获取实际硬件MAC地址:WifiInfo.getFactoryMacAddress()。
应用必须具备 READ_PRIVILEGED_PHONE_STATE 特权权限才能访问设备的不可重置标识符,包括IMEI和序列号。原则上 Android Q 建议避免使用更容易关联到我的的硬件标识符,而是使用实例ID。实例ID的作法推荐
除非您的应用程序是默认输入法编辑器或当前具备焦点的应用程序,不然您的应用程序没法访问剪贴板数据。
影响针对 Android Q API 级别运行的应用的更改:
若是您的应用针对Android Q,则您的应用只能在用户授予您访问USB设备或配件的应用权限后才能读取序列号。
影响在Android Q 上运行的全部应用的更改:
Android Q更改了默认状况下getCameraCharacteristics()方法返回的信息的广度。特别是,您的应用必须具备CAMERA权限才能访问此方法的返回值中包含的潜在设备特定元数据。
在Android Q上运行的应用没法启用或停用Wi-Fi。 WifiManager.setWifiEnabled()方法始终返回false。 若是须要,请使用设置面板提示用户启用和禁用Wi-Fi。
影响针对 Android Q API 级别运行的应用的更改:
除非您的应用具备ACCESS_FINE_LOCATION权限,不然在Android Q上运行时,您的应用没法在Wi-Fi,Wi-Fi Aware或蓝牙API中使用多种方法。要查看受影响方法的列表,请参阅隐私附录。
将Wi-Fi网络列表的手动配置限制在系统应用程序中。若是您的应用针对Android Q,则如下方法再也不返回有用数据,下面方法将不会返回有效信息:
针对 Android Q API 级别运行的应用,Android Q为须要检测用户移动的应用程序(例如步行,骑自行车或车辆)引入了新的ACTIVITY_RECOGNITION运行时权限。这旨在让用户了解设置中如何使用设备传感器数据。
最令咱们关心的,仍是咱们的适配工做。下面,分两部分讲:
为了确保应用稳定性和兼容性,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接口限制列表过长,这里直接附上查询地址
在 Android Q 上,与 Wi-Fi Direct 功能相关的广播再也不具备粘性。若是你的 APP 依赖于在注册时接收这些广播,能够在初始化时使用适当的get()方法来获取信息,具体可参考 WifiP2pManager 类相关方法。
在Android Q(Go版)设备上运行的应用没法接收SYSTEM_ALERT_WINDOW权限。这是由于绘制叠加窗口使用过多的内存,这对低内存Android设备的性能特别有害。
若是你的应用将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运行时(ART)再也不从应用程序进程调用dex2oat。此更改意味着ART将仅接受系统生成的OAT文件。
使用全屏Intent通知的应用必须在其应用的 Manifest 文件中请求 USE_FULL_SCREEN_INTENT 权限,这是正常权限,所以系统会自动授予。 若是针对Android Q或更高版本的应用尝试在不请求USE_FULL_SCREEN_INTENT权限的状况下建立具备全屏的Intent,系统将忽略全屏意图。
锤子科技"临死前"被"接盘",内部人士爆料已改签今日头条母公司