北京时间2019年3月14日Google官方正式公开发布Android Q Beta 1及其预览版SDK,这也表示了安卓开发人员又要迎来一年一度的新版本适配工作了。本次Android Q 给大家带来了挺多的新功能,如分享改进、黑夜模式、手势导航、更严格的权限管理等等。之后在4月份Beta2版本发布 。
一直到这个月 ,在 Google I/O 大会上 Google 正式发布最新的Android 10.0。本文将介绍Android Q 带来的新功能。
Android Q中的ShareSheet已更改。直接共享API已替换为新的共享快捷方式API。现有的直接共享机制将继续有效,但优先级低于使用新API的任何应用程序。
共享快捷方式API允许应用程序提前发布直接共享目标,而不是按需检测结果。这就是如何ShortcutManager工作的。由于这两个API类似,谷歌扩展了ShortcutInfo API以使这两个功能更容易使用。使用新API,您可以直接将类别或人员分配给共享目标。共享目标在系统中保留,直到相同的应用程序更新它们或卸载应用程序。
与旧的DirectShare API中使用的拉模型相比,新API使用推送模型。这使得在准备ShareSheet时更快地检索直接共享目标的过程。从应用程序开发人员的角度来看,在使用新API时,应用程序需要提前提供直接共享目标列表,并且每次应用程序的内部状态发生更改时都可能更新快捷方式列表(例如,如果在消息传递应用程序中添加新联系人)。
Android Q提供了一个新的Dark主题,适用于Android系统UI和设备上运行的应用程序。
黑暗主题有很多好处:
在Android Q中,有三种方法可以启用Dark主题:
在您的应用中支持 Dark 主题
为了支持 Dark 主题,您必须将应用程序的主题(通常位于res/values/styles.xml)中设置为从DayNight主题继承:
或者,您可以使用Window.setNavigationBarColor() 和动态执行此操作 Window.setStatusBarColor()。
处理冲突的应用手势
手势导航模型可能与应用程序开发人员以前使用的手势冲突。因此,您可能需要调整应用的用户界面。
与返回手势冲突
Back的新系统手势是从屏幕的左边缘或右边缘向内滑动。这可能会干扰这些区域中的应用导航元素。要保持屏幕左右边缘元素的功能,您需要选择退出Back手势,方法是向系统指示哪些区域需要接收触摸输入。你可以通过传递一个做到这一点List 的 View.setSystemGestureExclusionRects() 在Android Q的介绍这种方法API也可用于 ViewCompat作为 androidx.core:core:1.1.0-dev01。
List < Rect > exclusionRects ;
public void onLayout (
boolean changedCanvas ,int left ,int top ,int right ,int bottom ){
//更新rect bounds和exclusionRects列表
setSystemGestureExclusionRects (exclusionRects );
}
public void onDraw (Canvas canvas ){
//更新rect bounds和exclusionRects列表
setSystemGestureExclusionRects (exclusionRects );
}
与Home / Quick Switch手势冲突
Home和快速切换的新系统手势都涉及在导航栏先前占据的空间中屏幕底部的滑动。应用无法选择退出这些手势,因为他们可以使用Back手势。
为了缓解这个问题,Android Q引入了 WindowInsets.getMandatorySystemGestureInsets() API,通知应用程序触摸识别阈值。
Android Q中对用户的隐私安全有了进一步的更加严格的管控机制,更有效的保证了用户的隐私。
限制访问屏幕内容
为了保护用户的屏幕内容,Android Q通过改变READ_FRAME_BUFFER, CAPTURE_VIDEO_OUTPUT 和 CAPTURE_SECURE_VIDEO_OUTPUT权限的范围,使他们只能通过 签名访问 。
需要访问设备屏幕内容的应用应使用 MediaProjection API,而该API会显示提示,要求用户提供同意。
Location位置权限
Android Q可让用户更好控制应用何时能够访问设备位置信息。当在Android Q上运行的应用请求位置访问权限时,会弹出下面的对话框。此对话框可让用户将位置信息访问权限授予到两个不同的范围:在使用中(仅限前台)或始终(前台和后台)。
Android Q引入新的位置权限:ACCESS_BACKGROUND_LOCATION。这个权限与现有 ACCESS_FINE_LOCATION 和 ACCESS_COARSE_LOCATION 权限不同的是,新权限仅会影响应用在后台运行时对位置信息的访问权。除非应用的某个 Activity 可见或应用正在运行前台服务,否则应用将被视为在后台运行。可用如下代码来检测位置权限:
boolean permissionAccessCoarseLocationApproved =
ActivityCompat.checkSelfPermission(this, permission.ACCESS_COARSE_LOCATION)
== PackageManager.PERMISSION_GRANTED;
if (permissionAccessCoarseLocationApproved) {
boolean backgroundLocationPermissionApproved =
ActivityCompat.checkSelfPermission(this,
permission.ACCESS_BACKGROUND_LOCATION)
== PackageManager.PERMISSION_GRANTED;
if (backgroundLocationPermissionApproved) {
// 可在前台和后台访问位置信息
} else {
// 只能在前台访问位置信息
ActivityCompat.requestPermissions(this, new String[] {
Manifest.permission.ACCESS_BACKGROUND_LOCATION},
your-permission-request-code);
}
} else {
// 没有访问位置信息的权限,需要申请
ActivityCompat.requestPermissions(this, new String[] {
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_BACKGROUND_LOCATION
},
your-permission-request-code);
}
由此可见如果用户出于某种原因拒绝应用的后台访问,则将在位置检索中进行回退。
Android Q 改变了应用程序使用位置权限的方式。无论是在前台还是后台,apps 都将无法从服务中自由访问用户位置。为了支持向后兼容性,如果应用程序不以 Q 为目标,那么如果声明了 COARSE 或 FINE 权限,那么 ACCESS_BACKGROUND_LOCATION 权限也将被添加添加上。类似地,在运行时请求这两者中的任何一个也将授予这个权限。
这些更改使用户能够更好地控制应用程序访问其位置的方式,从而使开发者能够创建考虑到用户隐私和安全的 apps。
作者:黄磊
原文地址:https://blog.csdn.net/weixin_43243006/article/details/90731511