作者:Zhujiang

前言

安卓更新换代非常快,5.0之前版本更新的时间线有点看不懂,但5.0之后更新还是比较稳定的,大概一年更新一次,谷歌工程师对安卓每个版本的命名也有点意思,比如棒棒糖、棉花糖、奥利奥、馅饼啊啥的(命名的应该也是个吃货),还有,从1.5开始,之后的版本都按照英文字母顺序排列,从C开始,到现在的11排到了R。

2019年5月8日,谷歌在Google I/O 2019开发者大会上,正式公布了安卓10系统。经过数月的Beta版测试,谷歌又于2019年9月4日,推送了安卓10正式版。

从谷歌推出安卓10到现在也快一年的时间了,好多应用还没有适配,但现在安卓11的开发者预览版已经出来了,本来应该在今年的I/O大会上发布正式版安卓11的,但是由于疫情影响,3月21日发布消息,受新冠肺炎疫情影响,谷歌周五宣布彻底取消一年一度的I/O开发者大会,此前该公司在3月3日宣布,由于受到新冠病毒疫情的影响,将把I/O大会改为仅在线上举行,但现在线上大会也被取消了。

虽然今年I/O大会不开了,但是安卓11肯定要发布的,所以开发人员也别想跑,也需要适配啊!

准备工作

“大哥,你这说了半天安卓11的适配在哪呢?”

“别着急啊,下面不是就要说了嘛!”

“快说,再白活会就取关了!”

“这就来这就来,哎!如果你有Pixel,那么恭喜你可以直接通过刷OTA的方式来体验和提前适配安卓11。“

”没有?跟我一样来使用模拟器吧!“

“什么?不知道怎么配置?真的是,给你说下吧,记好了。”

  1. 在 Android Studio 中,依次点击 Tools > SDK Manager

  2. SDK Platforms 标签页下,选择窗口底部的 Show Package Details

  3. Android 11 Developer Preview 下,选择系统映像(例如 Google APIs Intel x86 Atom System Image)。

  4. SDK Tools 标签页中,选择最新版 Android 模拟器,点击 OK 开始安装。

  5. 安装完成后,依次选择 Tools > AVD Manager,然后按照说明创建新的 AVD。

    请务必选择 Pixel 设备,并对系统映像选择 R

  6. 返回 AVD 管理器的虚拟设备列表,双击新虚拟设备即可启动该设备。

“万事俱备,只欠适配了!”

这里就不写刷OTA的具体步骤了,需要的可以自行下载和刷写。

正文

“来了来了,开始了,别说话了,安静!!!”

分区存储

还记得在适配安卓10的时候设置requestLegacyExternalStorage为true来修改外部存储空间视图模型(true为 Legacy View,false 为 Filtered View)吗?这是重点:当您将应用更新为以 Android 11 为目标平台后,将无法使用 requestLegacyExternalStorage 来停用分区存储。

"大哥,这都停用了那我该怎么适配呢?"

“这孩子,猴急猴急的,这不就要说了嘛!”

数据迁移到使用分区存储时可见的目录:

在以 Android 11 为目标平台之前,应将数据迁移到与分区存储兼容的目录。在大多数情况下,可以将数据迁移到应用的应用专用目录。

如果有要迁移的数据,当用户升级到以 Android 11 为目标平台的新版应用时,可以保留旧版存储模型。这样,用户就可以保留对应用之前用来保存数据的目录中存储的应用数据的访问权限。要启用旧版存储模型以进行升级,请在应用的清单中将 preserveLegacyExternalStorage 属性设为 true

这里需要注意以下两点:

  • 大多数应用都不需要使用 preserveLegacyExternalStorage。此标记仅适用于这样一种情况:你将应用数据迁移到了与分区存储兼容的位置,并且希望用户在更新你应用时保留对数据的访问权限。使用此标记会导致更难以测试分区存储对应用的用户有何影响,因为当用户更新应用时,它会继续使用旧版存储模型。
  • 如果使用 preserveLegacyExternalStorage,则旧版存储模型只在用户卸载应用之前保持有效。如果用户在搭载 Android 11 的设备上安装或重新安装应用,则无论 preserveLegacyExternalStorage 的值是什么,应用都无法停用分区存储模型。

测试分区存储

如果要在应用中启用分区存储,而不考虑应用的目标 SDK 版本和清单标记值,请启用以下应用兼容性标记:

  • DEFAULT_SCOPED_STORAGE(默认情况下,对所有应用处于启用状态)
  • FORCE_ENABLE_SCOPED_STORAGE(默认情况下,对所有应用处于停用状态)

停用分区存储而改用旧版存储模型,请取消设置这两个标记。

管理设备存储空间

如果你的应用是文件管理器应用并且在 Android 11 上运行,它就不能再删除其他应用的缓存文件,即使您的应用具有所有文件访问权限也是如此(清理文件的应用尤其需要注意,比如某某管家、卫士啥的)。相反,你应执行以下操作:

  1. 通过调用 ACTION_MANAGE_STORAGE intent 操作来检查可用空间。
  2. 如果设备上的可用空间不足,请提示用户同意让您的应用清除所有缓存。为此,请调用 ACTION_CLEAR_APP_CACHE intent 操作。

这里需要注意:ACTION_CLEAR_APP_CACHE intent 操作会严重影响设备的电池续航时间,并且可能会从设备上移除大量的文件

媒体文件访问权限

这个很赞,Android 11 增加了以下访问媒体功能。

执行批量操作

为实现各种设备之间的一致性并增加用户便利性,Android 11 向 MediaStore API 中添加了多种方法。对于希望简化特定媒体文件更改流程(例如在原位置编辑照片)的应用而言,这些方法尤为有用。

添加的方法如下:

  • [createWriteRequest()](developer.android.google.cn/reference/a…(android.content.ContentResolver, java.util.Collection))

    用户向应用授予对指定媒体文件组的写入访问权限的请求。

  • [createFavoriteRequest()](developer.android.google.cn/reference/a…(android.content.ContentResolver, java.util.Collection, boolean))

    用户将设备上指定的媒体文件标记为“收藏”的请求。对该文件具有读取访问权限的任何应用都可以看到用户已将该文件标记为“收藏”。

  • [createTrashRequest()](developer.android.google.cn/reference/a…(android.content.ContentResolver, java.util.Collection, boolean))

    用户将指定的媒体文件放入设备垃圾箱的请求。垃圾箱中的内容在特定时间段(默认为 7 天)后会永久删除。

  • [createDeleteRequest()](developer.android.google.cn/reference/a…(android.content.ContentResolver, java.util.Collection))

    用户立即永久删除指定的媒体文件(而不是先将其放入垃圾箱)的请求。

系统在调用以上任何一个方法后,会构建一个 PendingIntent 对象。应用调用此 intent 后,用户会看到一个对话框,请求用户同意应用更新或删除指定的媒体文件。

使用原始路径访问文件

从 Android 11 开始,具有 READ_EXTERNAL_STORAGE 权限的应用可以使用直接文件路径和原生库来读取设备的媒体文件。通过这项新功能,应用可以更顺畅地使用第三方媒体库。

文件和目录访问限制

以下与存储访问框架 (SAF) 相关的变更只有在应用以 Android 11 为目标平台时才会生效。

访问目录

无法再使用 ACTION_OPEN_DOCUMENT_TREE intent 操作来请求访问以下目录:

  • Downloads 根目录。
  • 设备制造商认为可靠的各个 SD 卡卷的根目录,无论该卡是模拟卡还是可移除的卡。

访问文件

无法再使用 ACTION_OPEN_DOCUMENT_TREEACTION_OPEN_DOCUMENT intent 操作来请求用户从以下目录中选择单独的文件:

  • Android/data/ 目录及其所有子目录。
  • Android/obb/ 目录及其所有子目录。

权限

不管应用的目标 SDK 版本是什么,以下变更均会在 Android 11 中生效:

  • 存储运行时权限已重命名为文件和媒体
  • 如果应用未停用分区存储并且请求 READ_EXTERNAL_STORAGE 权限,则用户会看到不同于 Android 10 的对话框。该对话框会指示应用正在请求访问照片、视频、音频剪辑和文件。
  • 用户可以在系统设置中查看哪些应用具有 READ_EXTERNAL_STORAGE 权限。在设置 > 隐私 > 权限管理器 > 文件和媒体页面上,具有该权限的每个应用都列在允许存储所有文件下。

这里要注意:如果应用以 Android 11 为目标平台,切记,对“所有文件”的这种访问权限是只读访问权限。要使用此应用读取和写入共享的存储空间中的所有文件,需要具有所有文件访问权限。

所有文件访问权限

某些应用的核心用例需要访问大量的文件,如文件管理操作或备份和恢复操作。这些应用可通过执行以下操作来获取“所有文件访问权限”:

  1. 声明 MANAGE_EXTERNAL_STORAGE 权限。
  2. 使用 ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION intent 操作将用户引导至一个系统设置页面,在该页面上,用户可以为应用启用以下选项:授予所有文件的管理权限

“所有文件访问权限”可授予以下权限:

  • 对共享的存储空间内所有文件的读写访问权限。
  • MediaStore.Files 表的内容的访问权限。

应用可以使用 MediaStore API 或原始文件路径来访问这些文件。如果应用使用存储访问框架,不能使用它来访问“所有文件访问权限”提供的其他文件和目录。获得此权限的应用仍然无法访问属于其他应用的应用专用目录。这些目录在存储卷上显示为 Android/data/ 的子目录。

自定义消息框视图被屏蔽

出于安全方面的考虑,同时也为了保持良好的用户体验,如果包含自定义视图的消息框是以 Android 11 为目标平台的应用从后台发送的,则系统会屏蔽这些消息框。请注意,仍允许使用文本消息框;此类消息框是使用 Toast.makeText() 创建的,并不调用 setView()

如果您的应用仍尝试从后台发布包含自定义视图的消息框,则系统不会向用户显示相应的消息,而会执行以下操作:

  1. 显示以下消息框消息:

    Background custom toast blocked for package package-name. See g.co/dev/toast.

  2. 在 logcat 中记录以下消息:

    W/NotificationService: Blocking custom toast from package due to package not in the foreground

如果希望在消息框(文本消息框或自定义消息框)出现或消失时收到通知,请使用新的 addCallback() 方法。

这里需要注意,由于平台行为发生了变更,以 Android 11 为目标平台的应用会发现文本消息框受到以下负面影响:

  • getView() 方法返回 null
  • 以下方法的返回值并不反映实际值,因此尽量别使用:
    • getHorizontalMargin()
    • getVerticalMargin()
    • getGravity()
    • getXOffset()
    • getYOffset()
  • 以下方法是空操作,因此应用不应使用:
    • [setMargin()](developer.android.google.cn/reference/a…(float, float))
    • [setGravity()](developer.android.google.cn/reference/a…(int, int, int))

前台服务类型

从 Android 9 开始,应用仅限于在前台访问摄像头和麦克风。为了进一步保护用户,Android 11 更改了前台服务访问摄像头和麦克风相关数据的方式。如果应用以 Android 11 为目标平台并且在某项前台服务中访问这些类型的数据,则需要在该前台服务的声明的 foregroundServiceType 属性中添加新的 cameramicrophone 类型。

来举个例子吧,如果应用中的某项前台服务需要访问与设备的位置信息和摄像头相关的数据,请按以下代码段所示声明该服务:

    <manifest>...<service ... android:foregroundServiceType="location|camera" /></manifest>

MAC 地址

在以 Android 10(API 级别 29)及更低版本为目标平台的应用中,MAC 地址的随机分配是基于每个 SSID 进行的,因为 Passpoint 可以连接到同一资料的不同 SSID。而在以 Android 11(API 级别“R”)及更高版本为目标平台的应用中,Passpoint 网络的 MAC 地址随机分配将更改为针对每个完全限定域名 (FQDN) 进行分配。

对于以 API 级别“R”及更高级别为目标平台的应用,非特权应用将无法访问设备的 MAC 地址;只有具有 IPv4 地址的网络接口可见。会影响 getifaddrs()NetworkInterface.getHardwareAddress() 方法,以及 RTM_GETLINK netlink 消息的发送。

下面列出了此变更会以哪些方式来影响应用:

  • NetworkInterface.getHardwareAddress() 会针对每个接口返回 null。
  • 应用无法对 NETLINK_ROUTE 套接字使用 bind() 函数。
  • IP 命令不会返回有关接口的信息。

这些变更强制执行不要使用 MAC 地址中提供的指导。

请注意,大多数开发者应使用级别较高的 ConnectivityManager API 而不是级别较低的 NetworkInterface/getifaddrs() API。

每个进程的网络访问控制

从 Android 11 开始,处理敏感用户数据的应用可以向每个进程授予网络访问权限。通过明确指定允许哪些进程访问网络,您可以隔离不需要上传数据的所有代码。

虽然不能保证防止应用意外上传数据,但该功能可让降低应用中的错误导致数据泄露的几率。

下面显示了使用这项新功能的清单文件的示例:

    <processes><process /><deny-permission android:name="android.permission.INTERNET" /><process android:process=":withoutnet1" /><process android:process="com.android.cts.useprocess.withnet1"><allow-permission android:name="android.permission.INTERNET" /></process><allow-permission android:name="android.permission.INTERNET" /><process android:process=":withoutnet2"><deny-permission android:name="android.permission.INTERNET" /></process><process android:process="com.android.cts.useprocess.withnet2" /></processes>

一次性权限

在 Android 11 中,每当应用请求与位置信息、麦克风或摄像头相关的权限时,应用都会获得临时的一次性权限。这个其实在苹果中也有类似的权限申请。

Android 11 不建议重复请求特定权限组中的权限。在您的应用安装到设备上后,如果用户在使用过程中两次针对某项特定的权限点按拒绝,此操作表示其希望以后请求相应权限组中的该权限时“不再询问”。

系统还对与点按拒绝选项相仿的操作的响应行为做出了定义:

  • 如果用户按返回按钮关闭权限对话框,此操作不算“拒绝”操作。
  • 如果用户使用 [requestPermissions()](developer.android.google.cn/reference/a…(android.app.Activity, java.lang.String[], int)) 从您的应用转到系统设置,然后按返回按钮,此操作就算是“拒绝”操作。

悬浮窗口 intent 始终会将用户转至系统权限屏幕

从 Android 11 开始,ACTION_MANAGE_OVERLAY_PERMISSION intent 始终会将用户转至顶级设置屏幕,用户可在其中授予或撤消应用的 SYSTEM_ALERT_WINDOW 权限。intent 中的任何 package: 数据都会被忽略。

在更低版本的 Android 中,ACTION_MANAGE_OVERLAY_PERMISSION intent 可以指定一个文件包,它会将用户转至应用专用屏幕来管理权限。Android 11 不再支持此功能,而是必须由用户先选择要对其授予或撤消权限的应用。此变更可以让权限的授予更有目的性,从而达到保护用户的目的。

限制非 SDK 接口

如果应用并非以 Android 11 为目标平台,那么其中一些变更可能不会立即产生影响。虽然目前仍然可以使用灰名单中的一些非 SDK 接口(取决于应用的目标 API 级别),但如果使用任何非 SDK 方法或字段,则应用无法运行的风险终归较高。

如果不确定自己的应用是否使用了非 SDK 接口,则可以测试该应用,进行确认。如果应用依赖于非 SDK 接口,则应该开始计划迁移到 SDK 替代方案。如果无法为应用中的某项功能找到使用非 SDK 接口的替代方案,则应该请求新的公共 API。

Open Mobile API 变更

从 Android 11 开始,Open Mobile API (OMAPI) 有了额外的功能:

  • 解析运营商权限的规则。
  • 使用以下一项或多项来自定义嵌入式安全元件 (eSE) 访问权限或配置 eSE:
    • 系统特许权限
    • 可配置的访问规则应用主数据 (ARA-M) 应用标识符 (AID)
    • 用于重置 OMAPI 读取器的系统 API
  • 为读取器提供清晰的指示符,以便应用过滤设备功能。

支持并发使用多个摄像头

Android 11 添加了 API 来查询对同时使用多个摄像头(包括前置摄像头和后置摄像头)的支持。

要在运行应用的设备上检查支持情况,请使用以下方法:

  • getConcurrentStreamingCameraIds() 可返回摄像头 ID 组合 Set,这些组合可与有保证的数据流组合并发进行流式传输(如果它们是由同一应用进程配置的)。
  • isConcurrentSessionConfigurationSupported() 可查询摄像头设备是否可以并发支持相应的会话配置。

总结

到这里本篇文章也到了尾声了,本文基本写完了安卓11更新的主要内容,大家可以根据应用实际情况进行准备,现在还不着急适配,真正需要适配的话应该还得好几个月。最后再放一下官网地址:developer.android.google.cn/preview。 如果本文对你有帮助的话记得点赞关注啊,感激不尽!!!

另外,我分享一份从网络上收录整理的 Android架构视频+BAT面试专题PDF+学习笔记,还有Android开发面试专题资料,高级进阶架构资料供大家学习进阶, 希望可以帮助到大家进入大厂、拿到高薪。

如果你现在有需要的话,可以在 石墨文档 上查看《Android开发核心知识点笔记》最新版,路过别忘了点个Star

喜欢本文的话,不妨给我点个小赞、评论区留言或者转发支持一下呗~

《Android开发核心知识点笔记》

安卓11来了,快!扶我起来相关推荐

  1. 安卓11?快!扶我起来继续学

    前言 安卓更新换代非常快,5.0之前版本更新的时间线有点看不懂,但5.0之后更新还是比较稳定的,大概一年更新一次,谷歌工程师对安卓每个版本的命名也有点意思,比如棒棒糖.棉花糖.奥利奥.馅饼啊啥的(命名 ...

  2. 华为怎么升级Android11,华为EMUI 11/安卓11升级名单曝光 快来看看你的手机是否支持...

    华为EMUI 11/安卓11升级名单曝光 快来看看你的手机是否支持 2020年02月10日 16:29作者:NJNR205文章出处:泡泡网原创 分享 2月10日消息,据外媒报道,华为将于今年3月份的华 ...

  3. 谷歌不支持调用摄像头麦克风_谷歌发布安卓11系统:全新界面、更严的隐私管理...

    来源:快科技 在发布三个beta版之后,谷歌刚刚发布了安卓11(Android 11)正式版,主要加强了聊天气泡.安全隐私.电源菜单,以及对各种新屏幕,如瀑布屏.折叠屏.双屏的支持. 最近几个版本的安 ...

  4. 三星android11推送,三星国行S10系列正式推送One UI 3正式版,基于安卓11打造

    三星国行S10系列正式推送One UI 3正式版,基于安卓11打造 2021-02-04 13:56:50 24点赞 15收藏 101评论 2月4日消息,今日,三星GALAXY盖乐世官方微博宣布,国行 ...

  5. 现在更新鸿蒙会成为小白鼠吗,安卓11.0被停用,鸿蒙OS即将登上,花粉:宁愿当小白鼠...

    原标题:安卓11.0被停用,鸿蒙OS即将登上,花粉:宁愿当小白鼠 众所周知华为发布鸿蒙系统已有大半年时间,根据该系统微内核升级计划,再过几个月,鸿蒙2.0版本就要正式发布,到时候部分安卓系统内核将全部 ...

  6. android11obb,exagear安卓11数据包obb合集版

    exagear安卓11数据包obb合集版能够在手机上模拟端游游戏,兼容性特别的强大,可以运行非常多的大型游戏,想要玩端游在手机上就来这里体验吧. exagear安卓11数据包obb合集版特色: 1.模 ...

  7. android11开发版小米,小米CC9推送MIUI 12.5稳定版 新版系统内核升级至安卓11

    小米 CC9 今日正式推送 MIUI 12.5 稳定版.这款手机于 2019 年发布,搭载高通骁龙 710 处理器,特点为后置 4800 万像素主摄,主打拍照. 小米 CC9 新系统版本号为 MIUI ...

  8. 申请android11xColorOS,零时差适配安卓11!ColorOS 11升级公测版体验:丝滑顺畅

    原标题:零时差适配安卓11!ColorOS 11升级公测版体验:丝滑顺畅 一.写在前面:安卓11正式发布后 ColorOS抢先秒级推送 北京时间9月9日凌晨1点10分,谷歌悄无声息地放出安卓11的正式 ...

  9. android 11 机型,安卓11支持哪些机型,Android11适配机型一览

    安卓11正式版已经于9月9日开始推送,Pixel系列已经可以下载更新,而国内安卓手机机型都有哪些可以升级到安卓11呢?快和Xda小编一起来看看吧. 支持Android 11升级的具体机型如下: 三星: ...

最新文章

  1. 程序员总结:帮助你早些明白一些道理
  2. Java小程序—录屏小程序(上半场)
  3. linux中的rm 删除命令
  4. matplotlib学习日记(九)-图形样式
  5. python画长方形-怎么用python 画出任意占空比的一串矩形方波呢?
  6. python爬取百度图片(用于深度学习中数据集的收集)
  7. SAP UI5 Fiori flower动画效果的实现明细
  8. 大额存款到期,银行不能给兑付怎么办?
  9. 基于visual Studio2013解决C语言竞赛题之1049抓牌排序
  10. java bean set_JavaBean自动生成get和set方法
  11. 网上图书商城项目学习笔记-008修改密码功能
  12. Excel数据透视表经典教程十一《数据透视分析》
  13. STRIX z490i 10700k Monterey12.3黑苹果EFI分享
  14. springboot发送垃圾邮件
  15. 航天飞机电子计算机象征是什么,航天飞机的特点是什么
  16. 商品进销差价_零售企业商品进销差价的核算
  17. (附源码)springboot企业合同管理系统 毕业设计 161456
  18. 在Vmware14中安装Linux系统教程(图文教程)
  19. docker镜像指定安装源_详解如何修改docker pull镜像源
  20. php生成gif1009php生成gif,怎样将几张图片做成会动的GIF的动态图像?GIF动画制作软件,将图片制作成GIF动图...

热门文章

  1. ssh 连接报错:Unable to negotiate with 192.168.xx.xx port 22: no matching key exchange method found.
  2. 大型HashMap评估:JDK、FastUtil、Goldman Sachs、HPPC、Koloboke与Trove
  3. 出现 DB2 SQL Error: SQLCODE = -798, SQLSTATE = 428C9 错误的原因及解决方法
  4. 解决Uncaught ReferenceError: $ is not defined报错
  5. Microsoft Excel 2010表最多容纳的行数
  6. 学微积,用手机;勇于创新,敢于实践
  7. windows通过独立ip形式访问docker容器
  8. 一文读懂元宇宙--元宇宙技术及技术瓶颈
  9. 经营网站需要办理哪些牌照资质
  10. linux中替换的方法,linux vi 中s 替换方法