Android 11 开发者预览版计划从 2020 年 2 月启动,到向 AOSP 和 OEM 提供最终的公开版本时结束,最终版本预计将于 2020 年第 3 季度发布。那就是说等咱们真正用上正式版的时间大概是9、十月份,不过由于疫情缘由可能会有些许推迟,但愿疫情能早日结束吧!android
附上谷歌官网放出的时间线: api
不少小伙伴说刚刚用上了Android 10完成了版本适配,然而Android 11就已经到来了,安卓仔表示太难了...浏览器
虽然有些不情愿,可是想着系统版本升级确定是为了Android系统更加完善,想一想仍是挺好的一件事。那就让咱们一块儿来看看此次Android 11给咱们带来了什么吧 !缓存
对于用户来讲有哪些重要更新呢?安全
无缝更新bash
无缝更新会在Android 11 系统启动时须要虚拟A / B两个分区以减小由系统更新引发的停机时间,并提供一种在更新出现问题时能够恢复的机制。网络
Android系统更新时手机会启动进入恢复状态,而且可能会停留在“安装系统更新”屏幕上长达25分钟。这将致使大量的停机时间,在此期间您将没法运行任何APP,查看任何短信或接放任何电话。发生停机是由于更新系统文件时须要使系统分区脱机,可是无缝更新系统通使用两个系统分区来解决这个问题。并发
优化5G支持框架
Android 11 带来了全新的连接 API,用以支持 5G 网络,所以能够充分利用 5G 提供的改进的速度和延迟,如在检测到高质量网络时,使 APP 自动提供高质量视频。布局
动态计量API
使用此API,你能够检查链接是否未计量,若是是,则提供更高的分辨率或质量,从而可能使用更多数据。扩展了API的范围,使其包含蜂窝网络,以便您能够识别运营商在链接到运营商的5G网络时提供真正未计量数据的用户。
带宽估算器API
已更新了适用于5G的API,以使其更易于检查下行/上行带宽,而无需轮询网络或计算您本身的估算值。若是调制解调器不提供支持,咱们将基于当前链接进行默认估算。
打开飞行模式,蓝牙耳机不断连
在 Android 11 开发者预览版中,用户链接蓝牙耳机后,开启飞行模式依然支持蓝牙不断连,而且还有消息提醒。
滚动截屏/长截图
虽然不少手机厂商深度定制系统中早已集成,可是原生Android 11系统总算是支持了,也不错了。
电池共享
电池共享功能相似于“反向无线充电”,用户能够与其余兼容设备(包括智能手表,耳机等)共享 Pixel 的电池。
在快速回复中使用富媒体
从 Android 11 开始,用户能够在快速回复中插入图片和其余富媒体内容。
悬浮聊天气泡
Android 11 的新增了悬浮聊天气泡功能,只要 APP 使用全新的 API,就能够将正在进行的对话以气泡的形式悬浮在屏幕中。
隐私和权限
Android 11 新增了关于位置、麦克风和摄像头的一次性权限许可。也就是说,得到一次性权限许可的 APP 在下次使用时,依然要询问用户获取受权。
屏幕录像
屏幕录像曾在 Android 10 的早期版本中出现,但随后被删除了。随着 Android 11 开发者预览版的推出,屏幕录像功能又再次上线。
对于开发人员适配须要注意哪些呢?
附官网重大隐私权变动图:
Android10 就开始引进了分区存储功能,分区存储主要是将共享存储去分为各个集合,并限制应用对此区域随意访问
你们都知道Android10 提供了requestLegacyExternalStorage = true 选择退出分区存储,在Android11中就将会强制使用分区存储了。
不过官方为了给开发者更多时间进行测试,以 Android 10(API 级别 29)为目标平台的应用仍可请求 requestLegacyExternalStorage 属性。应用能够利用此标记暂时停用与分区存储相关的变动,例如授予对不一样目录和不一样类型的媒体文件的访问权限。当您将应用更新为以 Android 11 为目标平台后,系统会忽略 requestLegacyExternalStorage 标记。
保持与 Android 10 的兼容性
若是应用在 Android 10 设备上运行时选择退出分区存储,建议您继续在应用的清单文件中将 requestLegacyExternalStorage 设为 true。这样,应用就能够在运行 Android 10 的设备上继续按预期运行。
将数据迁移到使用分区存储时可见的目录
若是您的应用使用旧版存储模型且以前以 Android 10 或更低版本为目标平台,您可能会将数据存储到启用分区存储模型后您的应用没法访问的目录中。在以 Android 11 为目标平台以前,请将数据迁移到与分区存储兼容的目录。在大多数状况下,您能够将数据迁移到您的应用专用目录。
若是您有须要迁移的数据,当用户升级到以 Android 11 为目标平台的新版应用时,能够保留旧版存储模型。这样,用户就能够保留对您的应用以前用于保存数据的目录中存储的应用数据的访问权限。如需启用旧版存储模型以进行升级,请在应用的清单中将 preserveLegacyExternalStorage 属性设为 true。
注意:大多数应用都不须要使用 preserveLegacyExternalStorage。此标记仅适用于这样一种状况:您将应用数据迁移到了与分区存储兼容的位置,而且但愿用户在更新您的应用时保留对数据的访问权限。使用此标记会致使更难以测试分区存储对您应用的用户有何影响,由于当用户更新您的应用时,它会继续使用旧版存储模型。
若是您使用 preserveLegacyExternalStorage,旧版存储模型只在用户卸载您的应用以前保持有效。若是用户在搭载 Android 11 的设备上安装或从新安装您的应用,那么不管 preserveLegacyExternalStorage 的值是什么,您的应用都没法停用分区存储模型。
测试分区存储 如需在您的应用中启用分区存储,而不考虑应用的目标 SDK 版本和清单标记值,请启用如下应用兼容性标记:
DEFAULT_SCOPED_STORAGE(默认状况下,对全部应用处于启用状态) FORCE_ENABLE_SCOPED_STORAGE(默认状况下,对全部应用处于停用状态) 如需停用分区存储而改用旧版存储模型,请取消设置这两个标记。
针对全部应用
存储(Storage)运行时权限已改名为文件和媒体(Files & Media)
针对Android11为目标平台的应用
WRITE_EXTERNALSTORAGE 和WRITE_MEDIA_STORAGE再也不提供任何其余访问权限
若是您的应用是文件管理器应用而且在 Android 11 上运行,它就不能再删除其余应用的缓存文件,即便您的应用具备全部文件访问权限也是如此。相反,您的应用应执行如下操做:
经过调用 ACTION_MANAGE_STORAGE intent 操做检查可用空间。 若是设备上的可用空间不足,请提示用户赞成让您的应用清除全部缓存。为此,请调用 ACTION_CLEAR_APP_CACHE intent 操做。
注意:ACTION_CLEAR_APP_CACHE intent 操做会严重影响设备的电池续航时间,而且可能会从设备上移除大量的文件。
Android 11中未通过用户赞成是不能再删除其余应用的文件,即便您的应用具备全部文件访问权限也是如此。
容许进行批量编辑/删除
MediaStore API 中添加了多种方法
createWriteRequest()
用户向应用授予对指定媒体文件组的写入访问权限的请求。
createFavoriteRequest()
用户将设备上指定的媒体文件标记为“收藏”的请求。对该文件具备读取访问权限的任何应用均可以看到用户已将该文件标记为“收藏”。
createTrashRequest()
用户将指定的媒体文件放入设备垃圾箱的请求。垃圾箱中的内容会在系统定义的时间段后被永久删除。
createDeleteRequest()
用户当即永久删除指定的媒体文件(而不是先将其放入垃圾箱)的请求。
申请媒体文件的批量操做权限以下:(感谢google团队分享)
Android 10是不容许直接使用文件路径这种方式访问的,可是有些第三方框架调用native方法很难避免直接使用文件路径的方式,因此Android 11 开始容许具备 READ_EXTERNAL_STORAGE 权限的应用读取使用直接文件路径和原生库的设备媒体文件。借助此功能,您的应用与第三方媒体库会配合使用得更顺畅。
若是您使用直接文件路径和原生库,建议您在应用的清单文件中将 requestLegacyExternalStorage 设置为 true,从而选择停用分区存储。这样就能保证各个版本以前的兼容了。
须要注意的地方:
在 Android 11 上,应用没法再访问外部存储设备中的任何其余应用的专用于特定应用的目录中的文件。
为让开发者有时间进行测试,如下与存储访问框架 (SAF) 相关的变动只有在应用以 Android 11 为目标平台时才会生效。
访问目录
您没法再使用 ACTION_OPEN_DOCUMENT_TREE intent 操做请求访问如下目录:
内部存储卷的根目录。
设备制造商认为可靠的各个 SD 卡卷的根目录,不管该卡是模拟卡仍是可移除的卡。 Download 目录。
访问文件
您没法再使用 ACTION_OPEN_DOCUMENT_TREE 或 ACTION_OPEN_DOCUMENT intent 操做请求用户从如下目录中选择单独的文件:
Android/data/ 目录及其全部子目录。
Android/obb/ 目录及其全部子目录。
若是你的应用须要访问大量共享存储区的文件能够经过如下方式获取“全部文件访问权限”:
声明 MANAGE_EXTERNAL_STORAGE 权限。
使用 ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION intent
操做将用户引导至一个系统设置页面,在该页面上,用户能够为您的应用启用如下选项:授予全部文件的管理权限。
“全部文件访问权限”可授予如下权限:
对共享的存储空间内全部文件的读写访问权限。
对 MediaStore.Files 表的内容的访问权限。
该权限适用于文件管理和备份还原等批量处理功能的应用使用的,若是您只须要访问一个文件和几个文件这样的功能时使用存储访问框架就能够而不是获取“全部文件访问权限”,期待Google play做出更进一步的规范,明确合规/不合规的用例。
随着用户更加在乎应用的隐私性,在Android 11 中,用户可以针对位置信息、麦克风和摄像头指定更精细的权限
Android 11 中加入了一次性权限,每当应用请求与位置信息、麦克风或摄像头相关的权限时,面向用户的权限对话框就会包含仅限这一次选项。若是用户在对话框中选择此选项,系统会向应用授予临时的单次受权。 当使用完功能以后,系统就会回收这次权限。
而后,应用能够在一段时间内访问相关数据,具体时间取决于应用的行为和用户的操做:
当应用的 Activity 可见时,应用能够访问相关数据。
若是用户将应用转为后台运行,应用能够在短期内继续访问相关数据。
若是您在 Activity 可见时启动了一项前台服务,而且用户随后将您的应用转到后台,那么您的应用能够继续访问相关数据,直到该前台服务中止。
若是用户撤消单次受权(例如在系统设置中撤消),不管您是否启动了前台服务,应用都没法访问相关数据。与任何权限同样,若是用户撤消了应用的单次受权,应用进程就会终止。
关于适配:无需任何改动!!!
若是您的应用已遵循与权限相关的最佳作法,您无需更改应用便可支持单次受权。
须要特别指出的是,在尝试访问受某项权限保护的信息以前,请务必检查应用是否具备该权限;若是应用首次请求权限,或者若是用户已撤消权限,请完成如下流程:
1.调用 shouldShowRequestPermissionRationale()。若是此方法返回 true,请在您的应用中显示一个界面元素,向用户说明您的应用为什么须要获取权限。
2.请求权限。
当用户下次打开应用而且应用随后再次请求与位置信息、麦克风或摄像头相关的权限时,系统会再次提示用户。
请求权限的流程(感谢google团队分享):
第一次申请权限默认是不会有权限的调用缘由,当用户第一次拒绝了在这个回调里解释其权限调用缘由,当用户知道了缘由,再次申请权限系统就会调shouldShowRequestPermissionRationale() = true,开发者就能够在这个判断里面弹出权限的解释并让用户决定是否继续申请权限调取系统权限框或者(no thanks),系统的权限框调用了二次都拒绝了的话,就不再会显示了。
Android 11 不建议重复请求特定权限组中的权限。在应用安装到设备上后,若是用户在使用过程当中两次针对某项特定的权限点按拒绝,此操做表示其但愿之后请求相应权限组中的该权限时“再也不询问”。
系统还对与点按拒绝选项相仿的操做的响应行为作出了定义:
若是用户按返回按钮关闭权限对话框,此操做不算做“拒绝”操做。
若是用户使用 requestPermissions() 从您的应用转到系统设置,而后按返回按钮,此操做就算做“拒绝”操做。
Android 11 更改了您的应用在读取电话号码时使用的与电话相关的权限。
若是您的应用以 Android 11 为目标平台,而且须要访问如下列表中显示的电话号码 API,则必须请求 READ_PHONE_NUMBERS 权限,而不是 READ_PHONE_STATE 权限。
TelephonyManager 类和 TelecomManager 类中的 getLine1Number() 方法。
TelephonyManager 类中不受支持的 getMsisdn() 方法。
若是您的应用声明 READ_PHONE_STATE 以调用前面列表中的方法之外的方法,您能够继续在全部 Android 版本中请求 READ_PHONE_STATE。不过,若是您仅对前面列表中的方法使用 READ_PHONE_STATE 权限,请按如下方式更新您的清单文件:
更改 READ_PHONE_STATE 的声明,以使您的应用仅在 Android 10(API 级别 29)及更低版本中使用该权限。
添加 READ_PHONE_NUMBERS 权限。
如下清单声明代码段演示了此过程:
<manifest>
<!-- Grants the READ_PHONE_STATE permission only on devices that run
Android 10 (API level 29) and lower. -->
<uses-permission android:name="READ_PHONE_STATE"
android:maxSdkVersion="29" />
<uses-permission android:name="READ_PHONE_NUMBERS" />
</manifest>
复制代码
关于位置权限有前台位置权限和后台位置权限,在目标版本Android R如下版本的时候默认是申请前台位置权限的时候就同时申请了后台位置权限,而Android R开始是不能同时申请的,只能先申请前台位置权限再申请后台位置权限。
Android 11 经过如下方法进一步强调了用户对位置信息的控制:添加了单次受权,并移除了用户经过应用内提示授予 ACCESS_BACKGROUND_LOCATION 权限的功能
若是您的应用以 Android 11 为目标平台,您能够建立自定义界面,向用户解释您的应用为何须要 ACCESS_BACKGROUND_LOCATION 权限。
若是您的应用以较低版本为目标平台,您必须使用系统提供的界面,该界面中指出您的应用须要在后台访问位置信息,即便您的应用没有被使用。
若是您的应用以 Android 11 为目标平台,您能够显示自定义界面,用于更清楚地向用户解释您的应用为何须要 ACCESS_BACKGROUND_LOCATION 权限。
请遵循本部分中的准则,建立用户更容易理解的界面。
说明应用对后台位置信息的要求 如需在您的应用中请求 ACCESS_BACKGROUND_LOCATION,您的应用必须先获取前台位置权限,即 ACCESS_COARSE_LOCATION 或 ACCESS_FINE_LOCATION。若是您尝试同时请求 ACCESS_BACKGROUND_LOCATION 和其余任何权限,系统会抛出异常。
当有了前台位置权限后,你须要弹出为何请求后台位置权限的缘由的对话框:
授予权限。若是用户选择此选项,就对 ACCESS_BACKGROUND_LOCATION 发出权限请求。系统会将用户定向到系统设置,以完成授予此权限的过程。
为了帮助用户在设置中找到用于授予 ACCESS_BACKGROUND_LOCATION 权限的选项,您能够在应用的界面中为相应的设置选项添加用户可见的标签。getBackgroundPermissionOptionLabel() 方法可提供根据用户的设备语言偏好设置进行了本地化的标签。
不授予权限。若是用户不授予权限,他们应可以继续使用应用。若是用户选择此选项,应用能够正常继续运行,但可能会让用户离开须要后台位置信息访问权限的功能。
请注意,即便在向应用授予 ACCESS_BACKGROUND_LOCATION 权限后,用户也能够在系统设置中将其位置信息访问权限更改成仅在使用该应用时容许或每次都询问。用户也能够彻底拒绝应用访问位置信息。
若是用户赞成向您的应用授予 ACCESS_BACKGROUND_LOCATION 权限,您的应用应将用户定向系统设置里去选择开启权限
重定向到系统设置受限制
在应用让用户转到其在系统设置中的权限页面后,用户可能会选择始终容许之外的位置信息访问权限级别,如拒绝。Android 11 最多容许应用将用户从一个界面引导至系统设置两次。所以,请务必清楚地向用户解释应用功能为何须要在后台访问位置信息。
当应用达到此限制时,您仍然能够调用一个 intent,以将用户定向到应用在系统设置中的信息页面。在该页面中,用户能够转到应用的权限页面。如需加载应用信息页面,请使用 Settings.ACTION_APPLICATION_DETAILS_SETTINGS intent 操做。
Android 11 更改了应用查询同一设备上的其余已安装应用以及与之交互的方式。若是您的应用以 Android 11 为目标平台,您可能须要在应用的清单文件中添加 元素,以便系统了解应向您的应用显示哪些其余应用。
若是您知道要查询或与之交互的一组特定应用(例如,与您的应用集成的应用或您使用其服务的应用),请将其软件包名称添加到 标记内的一组 元素中:
<manifest package="com.example.game">
<queries>
<package android:name="com.example.store" />
<package android:name="com.example.services" />
</queries>
...
</manifest>
复制代码
您的应用可能须要查询一组具备特定用途的应用或与之交互,但您可能不知道要添加的具体软件包名称。在这种状况下,您能够在 标记中列出 intent 过滤器签名。而后,您的应用就能够发现具备匹配的 标记的应用。
如下示例容许您的应用看到支持 JPEG 图片共享功能的已安装应用:
<manifest package="com.example.game">
<queries>
<intent>
<action android:name="android.intent.action.SEND" />
<data android:mimeType="image/jpeg" />
</intent>
</queries>
...
</manifest>
复制代码
在极少数状况下,您的应用可能须要查询设备上的全部已安装应用或与之交互,无论这些应用包含哪些组件。例如,Google Play 等应用商店。为了容许您的应用看到其余全部已安装应用,Android 11 引入了 QUERY_ALL_PACKAGES 权限。
在即将推出的开发者预览版中,Google Play 会为须要此权限的应用提供相关指南,敬请期待。
如下列表包含几个不须要 声明的用例示例:
例如,若是其余应用向您应用中的内容提供程序发出请求,系统将容许您的应用看到该其余应用。
若是你想经过应用打开一个url,可是又不想打开的方式框里出现经过浏览器打开选项,则能够按照以下方式实现
若是手机中除了浏览器外没有适合打开该url的方式,则会抛出ActivityNotFoundException异常,能够获取到这个异常进行下一步的处理。
从 Android 9 开始,应用仅限于在前台访问摄像头和麦克风。为了进一步保护用户,Android 11 更改了前台服务访问摄像头和麦克风相关数据的方式。若是您的应用以 Android 11 为目标平台而且在某项前台服务中访问这些类型的数据,您须要在该前台服务的声明的 foregroundServiceType 属性中添加新的 camera 和 microphone 类型。
若是应用中的某项前台服务须要访问与设备的位置信息和摄像头相关的数据,请按如下代码段所示声明该服务:
<manifest>
...
<service ... android:foregroundServiceType="location|camera" />
</manifest>
复制代码
若是某项前台服务须要访问位置信息、摄像头和麦克风,请按如下代码段所示声明该服务:
<manifest>
...
<service ...
android:foregroundServiceType="location|camera|microphone" />
</manifest>
复制代码
Android 11 为了保护用户而弃用了自定义消息框视图。为了给开发者更多的时间来适应这些变动,只有在您的应用以 Android 11 为目标平台时,这些变动才会生效。
须要注意的地方:
若是包含自定义视图(使用了setView())的消息框是以 Android 11 为目标平台的应用从后台发送的,则系统会屏蔽这些消息框。
仍容许使用文本消息框;此类消息框是使用 Toast.makeText() 建立的,并不调用 setView()
若是您但愿在消息框(文本消息框或自定义消息框)出现或消失时收到通知,请使用新的 addCallback() 方法。
文本消息框 API 变动(以 Android 11 为目标平台的应用)
getView() 方法返回 null
复制代码
如下方法的返回值并不反映实际值,所以不该在您的应用中依赖于它们:
getHorizontalMargin()
getVerticalMargin()
getGravity()
getXOffset()
getYOffset()
复制代码
如下方法是空操做,所以您的应用不该使用它们:
setMargin()
setGravity()
复制代码
Android 11 添加了 API 以查询对同时使用多个摄像头(包括前置摄像头和后置摄像头)的支持。
如需在运行应用的设备上检查支持状况,请使用如下方法:
getConcurrentCameraIds() 可返回摄像头 ID 组合 Set,这些组合可与有保证的数据流组合并发进行流式传输(若是它们是由同一应用进程配置的)。
isConcurrentSessionConfigurationSupported() 可查询摄像头设备是否能够并发支持相应的会话配置。
Android 11 提供了一些 API 以支持瀑布屏,这是一种无边框的全面屏。这种显示屏被视为刘海屏的变体。现有的 DisplayCutout.getSafeInset…() 方法如今会返回可以避开瀑布区域以及刘海的安全边衬区。如需在瀑布区域中呈现您的应用内容,请执行如下操做:
调用 DisplayCutout.getWaterfallInsets() 以获取瀑布边衬区的精确尺寸。
将窗口布局属性 layoutInDisplayCutoutMode 设为 LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS,以容许窗口延伸到屏幕各个边缘上的刘海和瀑布区域。您必须确保刘海或瀑布区域中没有重要的内容。
使用 Android 11,能够经过如下方法使运行在采用合页式屏幕配置的设备上的应用可以肯定合页角度:提供具备 TYPE_HINGE_ANGLE 的新传感器,以及新的 SensorEvent,后者能够监控合页角度,并提供设备的两部分之间的角度测量值。您可使用这些原始测量值在用户操做设备时执行精细的动画显示。
尽管对于某些类型的应用(例如启动器和壁纸)而言,知道确切的合页角度会颇有用,但大多数应用都应该使用 Jetpack 窗口管理器库,经过调用 DeviceState.getPosture() 检索设备状态。
或者,您的应用也能够调用 registerDeviceStateChangeCallback(),以在 DeviceState 更改时收到通知,并在状态发生变化时作出响应。
因为目前市场上已经有且将来还会出现更多不一样的窗口和设备配置,所以对设备状态作出响应更加安全可靠。
在 Android 11(API 级别“R”)及更高版本中,具备 android.Manifest.permission.READ_PHONE_STATE 权限的应用能够经过 PhoneStateListener.onDisplayInfoChanged() 请求更新电话显示信息,其中包括用于营销和品牌塑造的无线接入技术信息。
这款新 API 提供了适用于不一样运营商的各类 5G 图标显示解决方案。支持的技术包括:
Android 11 还提供了更多的api及其功能能够参考 点我看世界
首先感受Google团队分享! 本文是参考官方文档和浏览Android 11 Labs 线上活动视频而整理总结出来的关于Android 11的知识,可能不够全面,还请你们多多指教,更多内容请查看Android开发者平台。
由于正式版Android 11还未发布,后续可能Google大佬还会更新一些其余的内容,最近的通常Android 11 Beta定于6月3号发布,但因美国多地爆发抗议等活动而推迟了,可能今年正式版出现的时间也会稍有推迟,可是正义终将到来!!!
但愿世界和平!!!