AndroidR

Android 11 基于 Android 前期版别构建,增加了多种功用和更新,以保证用户安全并提高通明度和可控性。一切开发者都应检查隐私功用并测试他们的运用。详细影响或许会因每个运用的核心功用、方针渠道和其他要素而异。

Android 11介绍

Android 11中的隐私权改变

Android 11行为改变

以 Android 11 为方针渠道的运用的行为改变

重大隐私权改变

下表汇总了 Android 11 中与隐私权相关的首要改变。

隐私权改变 受影响的运用 缓存策略
强制履行分区存储机制
以 Android 11 或更高版别为方针渠道的运用一直会受分区存储行为的影响
以 Android 11 或更高版别为方针渠道的运用,以及以 Android 10 为方针渠道且未将 requestLegacyExternalStorage 设为 true 以停用分区存储的运用 更新您的运用以运用分区存储
详细了解分区存储改变
单次授权
运用单次授权功用,用户能够颁发对方位信息、麦克风和摄像头的暂时拜访权限
在 Android 11 或更高版别上运转且恳求方位信息、麦克风或摄像头权限的运用 在测验拜访受某项权限维护的数据之前,检查您的运用是否具有该权限
遵循恳求权限方面的最佳做法
主动重置权限
假如用户在 Android 11 或更高版别上几个月未与运用互动,体系会主动重置运用的灵敏权限
以 Android 11 或更高版别为方针渠道且在后台履行大部分作业的运用 要求用户阻挠体系重置运用的权限
详细了解主动重置权限
后台方位信息拜访权限
Android 11 更改了用户向运用颁发后台方位信息权限的办法
以 Android 11 或更高版别为方针渠道且需求在后台拜访方位信息的运用 通过对权限恳求办法的屡次独自调用,逐渐恳求在前台(大略或精确)和后台拜访方位信息的权限。必要时,阐明用户颁发该权限所能得到的益处
详细了解 Android 11 中的在后台拜访方位信息的权限
软件包可见性
Android 11 更改了运用查询同一设备上的其他已装置运用及与之互动的办法
以 Android 11 或更高版别为方针渠道且与设备上的其他已装置运用交互的运用 <queries> 元素增加到运用的清单
详细了解软件包可见性
前台服务
Android 11 更改了前台服务拜访方位信息、摄像头和麦克风相关数据的办法
在 Android 11 或更高版别上运转且在前台服务中拜访方位信息、摄像头或麦克风的运用 分别针对需求拜访摄像头和麦克风的前台服务,声明 cameramicrophone 前台服务类型。但请留意,运用在后台运转时启动的前台服务一般无法拜访方位信息、摄像头或麦克风。
详细了解前台服务的改变

Android 11 中的存储机制更新

Android 11(API 等级 30)进一步增强了渠道功用,为外部存储设备上的运用和用户数据供给了更好的维护。此版别引入了多项增强功用,例如,可主动挑选启用的媒体原始文件途径拜访机制、面向媒体的批量编辑操作,以及存储拜访结构的界面更新。

Android 11 存储常见问题解答

强制履行分区存储

在 Android 11 上运转但以 Android 10(API 等级 29)为方针渠道的运用仍可恳求 requestLegacyExternalStorage 特点。运用能够利用此符号暂时停用与分区存储相关的改变,例如颁发对不同目录和不同类型的媒体文件的拜访权限。

当您将运用更新为以 Android 11 为方针渠道后,体系会疏忽 requestLegacyExternalStorage 符号。

假如是掩盖装置呢,能够增加android:preserveLegacyExternalStorage="true",暂时封闭分区存储,好让开发者完成数据搬迁的作业。为什么是暂时呢?由于只要卸载重装,就会失效了。

办理设备存储空间

从 Android 11 开端,运用分区存储模型的运用只能拜访本身的运用专用缓存文件。假如您的运用需求办理设备存储空间,请依照关于怎样查询可用空间的阐明操作。

  1. 通过调用 ACTION_MANAGE_STORAGE intent 操作检查可用空间。
  2. 假如设备上的可用空间不足,请提示用户赞同让您的运用清除一切缓存。为此,请调用 ACTION_CLEAR_APP_CACHE intent 操作。

留意ACTION_CLEAR_APP_CACHE intent 操作会严重影响设备的电池续航时间,而且或许会从设备上移除大量的文件。

外部存储设备上的运用专用目录

从 Android 11 开端,运用无法在外部存储设备上创立自己的运用专用目录。如需拜访体系为您的运用供给的目录,请调用 getExternalFilesDirs()

媒体文件拜访权限

为了在保证用户隐私的一同能够更轻松地拜访媒体,Android 11 增加了以下功用。

履行批量操作

在 Android 11 及更高版别中,您能够要求用户挑选一组媒体文件,然后通过一次操作更新这些媒体文件。这些办法可在各种设备上供给更好的共同性,而且可让用户更轻松地办理其媒体集合。

  • createWriteRequest():用户向运用颁发对指定媒体文件组的写入拜访权限的恳求。
  • createFavoriteRequest():用户将设备上指定的媒体文件符号为“收藏”的恳求。对该文件具有读取拜访权限的任何运用都能够看到用户已将该文件符号为“收藏”。
  • createTrashRequest():用户将指定的媒体文件放入设备垃圾箱的恳求。垃圾箱中的内容会在体系界说的时间段后被永久删去。
  • createDeleteRequest():用户当即永久删去指定的媒体文件(而不是先将其放入垃圾箱)的恳求。

体系在调用以上任何一个办法后,会构建一个 PendingIntent 方针。运用调用此 intent 后,用户会看到一个对话框,恳求用户赞同运用更新或删去指定的媒体文件。

例如,以下是构建 createWriteRequest() 调用的办法:

val urisToModify = /* A collection of content URIs to modify. */
val editPendingIntent = MediaStore.createWriteRequest(contentResolver,
        urisToModify)
// Launch a system prompt requesting user permission for the operation.
startIntentSenderForResult(editPendingIntent.intentSender, EDIT_REQUEST_CODE,
    null, 0, 0, 0)

评价用户的响应。假如用户供给了赞同声明,请持续履行媒体操作。不然,请向用户阐明您的运用为何需求获取相应权限:

override fun onActivityResult(requestCode: Int, resultCode: Int,
                 data: Intent?) {
    ...
    when (requestCode) {
        EDIT_REQUEST_CODE ->
            if (resultCode == Activity.RESULT_OK) {
                /* Edit request granted; proceed. */
            } else {
                /* Edit request not granted; explain to the user. */
            }
    }
}

您能够对 createFavoriteRequest()createTrashRequest()createDeleteRequest() 运用相同的通用形式。

运用直接文件途径和原生库拜访文件

developer.android.com/training/da…

为了协助您的运用更顺畅地运用第三方媒体库,Android 11(API 等级 30)及更高版别答应您运用 MediaStore API 以外的 API 来拜访共享存储空间中的媒体文件。不过,您能够改为运用以下任一 API 来直接拜访媒体文件:

  • File API。
  • 原生库,例如 fopen()

看到这儿也许会产生疑惑,在Android10中不是进行分区存储了么,这么Android11又开端能直接运用文件途径进行拜访了。其实这儿是Google在分区存储上为开发者做了优化(PS:这儿在网上看到有部分隔发者反应分区存储的Uri传到Native层时,这中Uri无法在Native层翻开^_^)。

也许有小伙伴问到已然Android11能够直接运用File API拜访媒体文件了,那分区存储这个适配还有必要么?(PS:我知道必定有必要,但我想知道为什么会有必要?)

testRequestPermissionActivityResult = registerForActivityResult(ActivityResultContracts.RequestPermission()) {
    if (!it) {
        Log.d(TAG, "testRequestPermissionActivityResult:授权失利")
        return@registerForActivityResult
    }
    //val str = "/sdcard/DCIM/Camera/PXL_20221109_112534451.mp4"//可拜访
    //val str = "/sdcard/screen/screen_10_23_17-41-47.png"//可拜访
    //val str = "/sdcard/Download/charles-proxy-ssl-proxying-certificate.pem.crt"//不行拜访
    //val str = "/sdcard/coverage.ec"//不行拜访
    //val str = Environment.getExternalStoragePublicDirectory("").absolutePath + "/test.txt"//不行拜访
    //val str = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).absolutePath + "/tanzhenxing.txt"//不行拜访
    //val str = Environment.getExternalStorageDirectory().absolutePath+"/Download/tanzhenxing.txt"//不行拜访
    val str = "/sdcard/Download/tanzhenxing02.txt"//不行拜访
    //val str = "/sdcard/Download/PXL_20221116_120102566.jpg"//可拜访
    //假如您没有任何与存储空间相关的权限,您能够拜访运用专属目录中的文件,并可运用 File API 拜访归因于您的运用的媒体文件。
    //假如您的运用测验运用 File API 拜访文件但没有必要的权限,就会产生 FileNotFoundException。
    //PS:假如这个文件是自己运用程序创立的,是能够通过FileAPI进行拜访的,但卸载重装会丢掉拜访权限;假如没有拜访权限会产生反常;
    val file = File(str)
    if (!file.exists()) {
        file.createNewFile()
    }
    setFileContent(file, "\nHello World~!")//给文件写入内容
    Log.d(TAG, "fileName:" + file.name)
    Log.d(TAG, "fileName:" + file.totalSpace)
    Log.d(TAG, "fileName:" + getFileContent(file))//输出文件内容
}
binding.test.setOnClickListener {
    testRequestPermissionActivityResult.launch(android.Manifest.permission.READ_EXTERNAL_STORAGE)
}

咱们看上面的一段代码就知道假如适配了Android11,那么只能通过File API 拜访媒体文件和自己有拜访权限的文件;除此之外咱们假如拜访其他文件会形成以下崩溃:

Caused by: java.io.FileNotFoundException: /sdcard/Download/tanzhenxing.txt: open failed: EACCES (Permission denied)
   at libcore.io.IoBridge.open(IoBridge.java:574)
   at java.io.FileInputStream.<init>(FileInputStream.java:160)
   at com.tzx.androidr.AndroidRMainActivity.getFileContent(AndroidRMainActivity.kt:57)
   at com.tzx.androidr.AndroidRMainActivity.onCreate$lambda-0(AndroidRMainActivity.kt:41)
   at com.tzx.androidr.AndroidRMainActivity.$r8$lambda$MxKbezjb4Znij4KrMlxgA5nFBbM(Unknown Source:0)
   at com.tzx.androidr.AndroidRMainActivity$$ExternalSyntheticLambda1.onActivityResult(Unknown Source:4)
   at androidx.activity.result.ActivityResultRegistry.doDispatch(ActivityResultRegistry.java:392)
   at androidx.activity.result.ActivityResultRegistry.dispatchResult(ActivityResultRegistry.java:351)
   at androidx.activity.ComponentActivity.onRequestPermissionsResult(ComponentActivity.java:667)
   at androidx.fragment.app.FragmentActivity.onRequestPermissionsResult(FragmentActivity.java:636)
   at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:8759)
   at android.app.Activity.dispatchActivityResult(Activity.java:8617)
   at android.app.ActivityThread.deliverResults(ActivityThread.java:5340)
   ... 13 more

适配Android11之后想要拜访文件,需求通过什么办法呢?

拜访运用专属目录

//分区存储空间,/data/data/package/files
val file = File(context.filesDir, filename)
//运用专属外部存储空间,/storage/sdcard0/Android/data/package/files
val appSpecificExternalDir = File(context.getExternalFilesDir(), filename)

拜访公共媒体目录文件

运用MediaStore或许SAF(存储拜访结构–Storage Access Framework)

拜访其他运用中的数据

为维护用户的隐私,在搭载 Android 11 或更高版别的设备上,体系会进一步对您的运用拜访其他运用的私有目录的行为进行约束。

拜访内部存储设备上的数据目录

假如您的运用以 Android 11 为方针渠道,则不能拜访其他任何运用的数据目录中的文件,即使其他运用以 Android 8.1(API 等级 27)或更低版别为方针渠道且已使其数据目录中的文件大局可读也是如此。

拜访外部存储设备上的运用专用目录

在 Android 11 上,运用无法再拜访外部存储设备中的任何其他运用的专用于特定运用的目录中的文件。

一切文件拜访权限

运用能够通过履行以下操作向用户恳求“一切文件拜访权限”:

  1. 在清单中声明 MANAGE_EXTERNAL_STORAGE 权限。
  2. 运用 ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION intent 操作将用户引导至一个体系设置页面,在该页面上,用户能够为您的运用启用以下选项:颁发一切文件的办理权限

如需确认您的运用是否已取得 MANAGE_EXTERNAL_STORAGE 权限,

请调用 Environment.isExternalStorageManager()

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
val intent = Intent()
intent.action= Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION
startActivity(intent)
val isHasStoragePermission= Environment.isExternalStorageManager()

文档拜访约束

为让开发者有时间进行测试,以下与存储拜访结构 (SAF) 相关的改变只要在运用以 Android 11 或更高版别为方针渠道时才会生效。

拜访目录

您无法再运用 ACTION_OPEN_DOCUMENT_TREE intent 操作恳求拜访以下目录:

  • 内部存储卷的根目录。
  • 设备制造商以为牢靠的各个 SD 卡卷的根目录,不论该卡是模拟卡还是可移除的卡。牢靠的卷是指运用在大多数情况下能够成功拜访的卷。
  • Download 目录。

拜访文件

您无法再运用 ACTION_OPEN_DOCUMENT_TREEACTION_OPEN_DOCUMENT intent 操作恳求用户从以下目录中挑选独自的文件:

  • Android/data/ 目录及其一切子目录。
  • Android/obb/ 目录及其一切子目录。

权限恳求相关改变

单次授权

从 Android 11 开端,每逢运用恳求与方位信息、麦克风或摄像头相关的权限时,面向用户的权限对话框会包括仅限这一次选项。假如用户在对话框中挑选此选项,体系会向运用颁发暂时的单次授权。

然后,运用能够在一段时间内拜访相关数据,详细时间取决于运用的行为和用户的操作:

  • 当运用的 activity 可见时,运用能够拜访相关数据。
  • 假如用户将运用转为后台运转,运用能够在短时间内持续拜访相关数据。
  • 假如您在 activity 可见时启动了一项前台服务,而且用户随后将您的运用转到后台,那么您的运用能够持续拜访相关数据,直到该前台服务中止。

AndroidR兼容性适配指南

运用进程在权限被吊销时停止

假如用户吊销单次授权(例如在体系设置中吊销),不论您是否启动了前台服务,运用都无法拜访相关数据。与任何权限一样,假如用户吊销了运用的单次授权,运用进程就会停止。

当用户下次翻开运用而且运用中的某项功用恳求拜访方位信息、麦克风或摄像头时,体系会再次提示用户颁发权限。

主动重置未运用的运用的权限

假如运用以 Android 11 或更高版别为方针渠道而且数月未运用,体系会通过主动重置用户已颁发运用的运转时灵敏权限来维护用户数据。此操作与用户在体系设置中检查权限并将运用的拜访权限等级更改为回绝的做法作用一样。假如运用遵循了有关在运转时恳求权限的最佳做法,那么您不必对运用进行任何更改。这是由于,当用户与运用中的功用互动时,您应该会验证相关功用是否具有所需权限。

权限对话框的可见性

从 Android 11 开端,在运用装置到设备上后,假如用户在运用进程中屡次针对某项特定的权限点按回绝,那么在您的运用再次恳求该权限时,用户将不会看到体系权限对话框。该操作表明用户期望“不再问询”。在之前的版别中,除非用户从前已选中“不再问询”对话框或选项,不然每逢您的运用恳求权限时,用户都会看到体系权限对话框。Android 11 中的这一行为改变旨在防止重复恳求用户已挑选回绝的权限。

体系提醒窗口改变

在 Android 11 中,向运用颁发 SYSTEM_ALERT_WINDOW 权限的办法产生了一些改变。这些改变能够让权限的颁发更有意图性,然后达到维护用户的意图。

依据恳求主动向某些运用颁发 SYSTEM_ALERT_WINDOW 权限

体系会依据恳求主动向某些类型的运用颁发 SYSTEM_ALERT_WINDOW 权限:

  • 体系会主动向具有 ROLE_CALL_SCREENING 且恳求 SYSTEM_ALERT_WINDOW 的一切运用颁发该权限。假如运用失掉 ROLE_CALL_SCREENING,就会失掉该权限。
  • 体系会主动向通过 MediaProjection 截取屏幕且恳求 SYSTEM_ALERT_WINDOW 的一切运用颁发该权限,除非用户已清晰回绝向运用颁发该权限。当运用中止截取屏幕时,就会失掉该权限。此用例首要用于游戏直播运用。

这些运用无需发送 ACTION_MANAGE_OVERLAY_PERMISSION 以获取 SYSTEM_ALERT_WINDOW 权限,它们只需直接恳求 SYSTEM_ALERT_WINDOW 即可。

MANAGE_OVERLAY_PERMISSION intent 一直会将用户转至体系权限屏幕

从 Android 11 开端,ACTION_MANAGE_OVERLAY_PERMISSION intent 一直会将用户转至顶级设置屏幕,用户可在其间颁发或吊销运用的 SYSTEM_ALERT_WINDOW 权限。intent 中的任何 package: 数据都会被疏忽。

在更低版别的 Android 中,ACTION_MANAGE_OVERLAY_PERMISSION intent 能够指定一个软件包,它会将用户转至运用专用屏幕以办理权限。从 Android 11 开端将不再支撑此功用,而是有必要由用户先挑选要颁发或吊销哪些运用的权限。此改变能够让权限的颁发更有意图性,然后达到维护用户的意图。

电话号码

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 权限,请按以下办法更新您的清单文件:

  1. 更改 READ_PHONE_STATE 的声明,以使您的运用仅在 Android 10(API 等级 29)及更低版别中运用该权限。
  2. 增加 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 11 或更高版别为方针渠道的运用从后台发送的,体系会屏蔽这些音讯框。请留意,仍答应运用文本音讯框;此类音讯框是运用 Toast.makeText() 创立的,并不调用 setView()

假如您的运用仍测验从后台发布包括自界说视图的音讯框,体系不会向用户显现相应的音讯,而是会在 logcat 中记载以下音讯:

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

需求重视的是假如运用处于后台,且需求展现吐司。那么运用原生的Toast~!

音讯框回调

假如您期望在音讯框(文本音讯框或自界说音讯框)呈现或消失时收到通知,请运用 Android 11 中增加的 addCallback() 办法。

相机

媒体 intent 操作需求体系默许相机

从 Android 11 开端,只要预装的体系相机运用能够响应以下 intent 操作:

  • android.media.action.VIDEO_CAPTURE
  • android.media.action.IMAGE_CAPTURE
  • android.media.action.IMAGE_CAPTURE_SECURE

假如有多个预装的体系相机运用可用,体系会显现一个对话框,供用户挑选运用。假如您期望自己的运用运用特定的第三方相机运用来代表其捕获图片或视频,能够通过为 intent 设置软件包名称或组件来使这些 intent 变得清晰。

运用打包和装置

压缩的资源文件

假如以 Android 11(API 等级 30)或更高版别为方针渠道的运用包括压缩的 resources.arsc 文件或许假如此文件未按 4 字节鸿沟对齐,运用将无法装置。假如存在其间任意一种情况,体系将无法对此文件进行内存映射。无法进行内存映射的资源表有必要读入 RAM 中的缓冲区,然后给体系形成不必要的内存压力,并大大增加设备的 RAM 运用量。

现在需求 APK 签名计划 v2

关于以 Android 11(API 等级 30)为方针渠道,且现在仅运用 APK 签名计划 v1 签名的运用,现在还有必要运用 APK 签名计划 v2 或更高版别进行签名。用户无法在搭载 Android 11 的设备上装置或更新仅通过 APK 签名计划 v1 签名的运用。

如需验证您的运用是否已运用 APK 签名计划 v2 或更高版别进行签名,您能够在命令行中运用 Android Studio 或 apksigner 东西。

留意:为支撑运转旧版 Android 的设备,除了运用 APK 签名计划 v2 或更高版别为您的 APK 签名之外,您还应持续运用 APK 签名计划 v1 进行签名。

后台方位信息拜访权限

Android 11 更改了运用中的功用获取后台方位信息拜访权限的办法。本部分介绍了上述各项改变。

假如运用中的某项功用从后台拜访方位信息,请验证此类拜访是否有必要,并考虑以其他办法获取该功用所需的信息。如需详细了解在后台拜访方位信息的权限,请参阅在后台拜访方位信息页面。

独自恳求在后台拜访方位信息

正如有关怎样在运转时恳求方位信息拜访权限的攻略中所述,您应该履行递增方位信息恳求。假如您的运用以 Android 11 或更高版别为方针渠道,体系会强制履行此最佳做法。假如您一同恳求前台拜访方位信息的权限和在后台拜访方位信息的权限,体系会疏忽该恳求,且不会向您的运用颁发其间的任一权限。

权限对话框的改变

在搭载 Android 11 或更高版别的设备上,您的运用中的某项功用恳求在后台拜访方位信息时,体系对话框不会包括用于启用在后台拜访方位信息权限的按钮。如需启用在后台拜访方位信息的权限,用户有必要在设置页面上针对运用的方位权限设置一概答应选项,如介绍怎样恳求在后台拜访方位信息的攻略中所述。

后台方位信息拜访权限运用总结

上面三个部分是摘自Android 11 中的方位信息更新,看完之后是不是感觉云里雾里的。下面举几个比如我们就会明白。

private fun initTestLocationFunc() {
    binding.testLocation.setOnClickListener {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissions(arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_BACKGROUND_LOCATION), 100)
        }
    }
}

android11以下的设备,恳求前台和后台方位权限(任意targetSdkVersion):

AndroidR兼容性适配指南

Android11及以上的设备,targetSdkVersion<=29(Android 10),恳求前台和后台方位权限:

AndroidR兼容性适配指南

Android11及以上的设备,targetSdkVersion=30(Android 11),恳求前台和后台方位权限:

无反响,(PS:Android 11 或更高版别为方针渠道,体系会强制履行此最佳做法。假如您一同恳求前台拜访方位信息的权限和在后台拜访方位信息的权限,体系会疏忽该恳求,且不会向您的运用颁发其间的任一权限。独自恳求在后台拜访方位信息)

private fun initTestForeGroundLocationFunc() {
    binding.testForegroundLocation.setOnClickListener {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissions(arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION), 100)
        }
    }
}
private fun initTestBackGroundLocationFunc() {
    binding.testBackgroundLocation.setOnClickListener {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissions(arrayOf(Manifest.permission.ACCESS_BACKGROUND_LOCATION), 100)
        }
    }
}

Android11及以上设备,先恳求前台方位权限,后恳求后台方位权限:

  • 先履行恳求前台权限(targetSdkVersion不区分);

AndroidR兼容性适配指南

  • 后履行恳求后台权限(targetSdkVersion=29);

AndroidR兼容性适配指南

  • 后履行恳求后台权限(targetSdkVersion=30);

AndroidR兼容性适配指南

看完以上的实现作用,咱们很清楚知道了该怎样进行后台定位权限的恳求阐明了吧。

  • targetSdkVersion<30情况下,假如你之前就有判断过前台和后台方位权限,那就无需忧虑,没有什么需求适配。

  • targetSdkVersion>30情况下,需求分隔恳求前后台方位权限,而且对后台方位权限恳求做好阐明和引导,当然也是为了更好的服务用户。

软件包可见性

Android 11 中的软件包可见性

Android 11 更改了运用查询用户已在设备上装置的其他运用以及与之交互的办法。运用 <queries> 元素,运用能够界说一组本身可拜访的其他软件包。通过告知体系应向您的运用显现哪些其他软件包,此元素有助于鼓励最小权限准则。此外,此元素还可协助 Google Play 等运用商铺评价运用为用户供给的隐私权和安全性。

声明您的运用与一组特定的其他运用交互

假如您的运用以 Android 11 或更高版别为方针渠道,您或许需求在运用的清单文件中增加 <queries> 元素。在 <queries> 元素中,按软件包名称、按 intent 签名或按供给程序授权指定其他运用,如以下部分所述。

查询特定软件包及与之交互

假如您知道要查询或与之交互的一组特定运用(例如,与您的运用集成的运用或您运用其服务的运用),请将其软件包名称增加到 <queries> 元素内的一组 <package> 元素中:

<manifest package="com.example.game">
    <queries>
        <package android:name="com.example.store" />
        <package android:name="com.example.services" />
    </queries>
    ...
</manifest>

在给定 intent 过滤器的情况下查询运用及与之交互

您的运用或许需求查询一组具有特定用途的运用或与之交互,但您或许不知道要增加的详细软件包名称。在这种情况下,您能够在 <queries> 元素中列出 intent 过滤器签名。然后,您的运用就能够发现具有匹配的 <intent-filter> 元素的运用。

以下示例答应您的运用看到支撑 JPEG 图片共享功用的已装置运用:

<manifest package="com.example.game">
    <queries>
        <intent>
            <action android:name="android.intent.action.SEND" />
            <data android:mimeType="image/jpeg" />
        </intent>
    </queries>
    ...
</manifest>

<intent> 元素有一些约束,详细能够检查 developer.android.com/training/ba…

一切运用(不引荐)

在极少数情况下,您的运用或许需求查询设备上的一切已装置运用或与之交互,不论这些运用包括哪些组件。为了答应您的运用看到其他一切已装置运用,体系会供给 QUERY_ALL_PACKAGES 权限。

下面列举了一些适合增加 QUERY_ALL_PACKAGES 权限的用例:

  • 无障碍运用
  • 浏览器
  • 设备办理运用
  • 安全运用
  • 防病毒运用

不过,一般能够通过以下办法实现您运用的用例:与一组主动可见的运用交互,并在您的清单文件中声明您的运用需求拜访的其他运用。为了尊重用户隐私,您的运用应恳求运用正常作业所需的最小软件包可见性。

这项来自 Google Play 的方针更新为需求 QUERY_ALL_PACKAGES 权限的运用供给了相关准则。

API更新

5G

向您的运用增加 5G 功用

在决议怎样与 5G 互动时,考虑一下您企图打造什么样的体会。5G 可通过一些办法增强您的运用,其间包括:

  • 由于 5G 在速度和推迟方面的改进,主动使当前的体会更快更好。
  • 提升用户体会,如通过显现 4k 视频或下载分辨率更高的游戏财物。
  • 在确认增加的流量耗费不会让用户付费后,增加一般仅通过 WLAN 供给的体会,如主动下载一般为不按流量计费的 WLAN 保存的内容。
  • 供给 5G 独有的体会,这种体会只能在高速度且低推迟的网络上实现。

Android 11 增加了 5G API,使您的运用能够增加各种先进的功用。

  • 按流量计费性
  • 5G 检测
  • 带宽估测

前台服务

在 Android 11 中,前台服务何时能够拜访设备的方位信息、摄像头和麦克风产生了一些改变。这有助于维护灵敏的用户数据。

前台服务类型 camera 和 microphone

假如您的运用以 Android 11 或更高版别为方针渠道,且在前台服务中拜访摄像头或麦克风,则有必要增加前台服务类型 cameramicrophone

上一篇文章叙述适配Android10的时分,关于前台定位服务就有必要加上android:foregroundServiceType="location"

现在Android11上又增加了两个权限约束(摄像头和麦克风),假如前台服务需求拜访方位、摄像头和麦克风,请按以下代码段所示声明服务:

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

对在运用时拜访的约束

假如您的运用在后台运转时启动了某项前台服务,则该前台服务无法拜访麦克风或摄像头。此外,除非您的运用具有在后台拜访方位信息的权限,不然该服务无法拜访方位信息。

有些部分豁免约束,能够参阅developer.android.com/guide/compo…

数据拜访审阅

为了让运用及其依赖项拜访用户私密数据的进程愈加通明,Android 11 引入了数据拜访审阅功用。凭借此流程得出的见地,您能够更好地识别或许呈现的意外数据拜访。您的运用能够注册 AppOpsManager.OnOpNotedCallback 实例,该实例可在每次产生以下任一事情时履行相应操作:

  • 运用的代码拜访私密数据。为了协助您确认运用的哪个逻辑部分调用了事情,您能够按归因符号审阅数据拜访。
  • 依赖库或 SDK 中的代码拜访私密数据。

如需了解概况,请参阅有关怎样审阅对数据的拜访权限的攻略。

简单描述一下该功用的运用,创立一个带符号的Context。然后用这个Context拜访一些私密数据的时分就能在注册的回调里面获取相关的调用信息。

其实感觉这个并不能太大的作用,而且关于代码的入侵本钱过高。相同的功用咱们通过切面很容易搞定的。

FAQ

Android 11 存储常见问题解答 Android 11 storage FAQ,我从中找几条记载一下。

Scoped Storage 是否答应运用程序运用文件途径拜访文件,例如运用文件 API?

咱们认识到某些运用依赖于直接拜访媒体文件途径的代码或库。因而在 Android 11 上,具有读取外部存储权限的运用程序能够拜访规模存储环境中具有文件途径的文件。在 Android 10 设备上,这对规模存储环境中的运用程序不行用,除非它们通过设置 android:requestLegacyExternalStorage 清单特点挑选退出。为确保跨 Android 版别的连续性,假如您的运用以 Android 10 或更高版别为方针,您也应该挑选退出。有关详细信息,请参阅分区存储最佳实践。

与 Media Store API 相比,文件途径拜访的性能怎样?

性能实际上取决于切当的用例。关于视频播映等次序读取,文件途径拜访供给与媒体存储适当的性能。可是关于随机读写,运用文件途径或许会慢两倍。为了实现最快和最共同的读写,咱们引荐运用 Media Store API

与 Android 10 相比,在 Android 11 中运用存储拜访结构是否有任何进一步的约束?

针对 Android 11(API 等级 30)并运用存储拜访结构的运用程序将无法再颁发对目录的拜访权限,例如 SD 卡的根目录和下载目录。不论方针 SDK 是什么,Android 11 上的存储拜访结构都无法用于获取对 Android/dataAndroid/obb 目录的拜访权限。详细了解这些约束和测试行为的办法。

分区存储中的运用程序是否仅限于将文件写入其特定于运用程序的数据目录?

在分区存储中,运用程序能够将媒体文件贡献给媒体商铺收藏。Media Store 会依据文件类型将文件放入组织杰出的文件夹中,例如 DCIM、电影、下载等。关于一切此类文件,运用程序也能够持续通过文件 API 进行拜访。操作体系维护一个体系,将运用程序归因于每个媒体存储文件,因而运用程序能够读取/写入它们开始贡献给媒体存储的文件,而无需存储权限。

Media Store DATA 列已被弃用,运用攻略是什么?

在 Android 10 上,作用域存储环境中的运用无法运用文件途径拜访文件。为了与此设计坚持共同,咱们其时弃用了 DATA 列。依据您对运用现有本机代码或库的需求的反应,Android 11 现在支撑分区存储中运用的文件途径拜访。因而,DATA 列实际上对某些情况很有用。关于媒体商铺的刺进和更新,Scoped Storage 中的运用程序应运用 DISPLAY_NAMERELATIVE_PATH 列。他们不能再为此运用 DATA 列。当读取磁盘上存在的文件的媒体存储条目时,DATA 列将具有有效的文件途径,可与文件 API 或 NDK 文件库一同运用。

总结

Android11的适配和Android10适配最好一同进行,由于这两个版别相关隐私改变对开发者的影响首要是分区存储相关的适配导致的事务逻辑修正。

分区存储的相关适配

  1. Android10上能够运用android:requestLegacyExternalStorage先进行过渡,但过渡的时分咱们需求将运用内的一些数据进行相关分区存储的搬迁;完成了这个步骤,咱们在进行Android11适配的时分会愈加容易;
  2. 在进行Android11相关分区存储适配时,运用内的相关媒体操作咱们授权存储权限之后还能够是用File API。这个基本上就处理了大部分的分区存储的适配问题。而咱们在Android10适配的时分又把相关的数据文件搬迁到了运用的私有空间也能够通过File API进行文件拜访。
  3. 最终呢!咱们将一些拍照、适配录制和图片保存,以及一些对外分享的事务进行相关修正就行。

另外国外通过屡次的app合规整改之后,咱们大部分隔发者只需求侧重的是来自后台的自界说音讯框被屏蔽APK签名计划V2后台方位信息拜访权限以及电话号码这些修正。其他的无线调试设备到设备文件传输约束对 APN 数据库的读取拜访在元数据文件中声明“无障碍”按钮运用情况等其他的Android11的修正,我们能够参阅以 Android 11 为方针渠道的运用的行为改变。

参阅文章:拖不得了,Android11真的要来了,最全适配实践攻略奉上

GitHub Demo