Android Q(10.0)注意事项

本文将介绍 Android Q 的部分适配问题,也是大家开发适配过程中大概率会遇到的问题:

https://developer.android.com/preview/features

Q 行为变更:所有应用

注意: 早期测试版本中引入的专门用于操作媒体文件的权限 
* READ_MEDIA_IMAGES,
* READ_MEDIA_AUDIO,
* READ_MEDIA_VIDEO – 现已过时!

为了能给用户提供对文件的更多控制并限制文件混乱,Android Q 改变了应用程序访问设备外部存储上文件的方式,例如存储在路径/ sdcard 中的文件。Android Q 继续使用 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 权限,这些权限对应于存储面向用户的运行时权限。但是,默认情况下 targetSdkVersion 设置为 Android Q 的应用(以及 manifest 清单开启属性来启动这个变更的应用)会获得一个沙盒视图到外部存储。此类应用程序只能看到其特定于应用程序的目录和特定媒体类型,因此应用程序不需要请求任何其他用户权限。
2020021118324586.png
20200211184932290.png
也就是说从 Android Q(10.0) sdk>=29 开始,系统为每个 app 提供了一个隔离环境(分区存储),参考下列资料,有十分详细的说明,这里给出解决办法

参考资料:
开发者文档 https://developer.android.google.cn/training/data-storage/files/external-scoped?hl=zh_cn

解决办法

①在 AndroidManifest.xml 中加入 android:requestLegacyExternalStorage=“true”

加入这句代码之后会启动兼容模式:停用分区存储,但是要留意的是

警告:2020 年,主要平台版本将要求所有应用都使用分区存储,无论应用的目标 SDK 级别是多少。因此,您应该提前确保您的应用能够使用分区存储。为此,请确保针对搭载 Android 10(API 级别 29)及更高版本的设备启用了该行为。

在您的应用完全兼容分区存储之前,您可以根据应用的目标 SDK 级别或 requestLegacyExternalStorage 清单属性,暂时选择停用分区存储:

以 Android 9(API 级别 28)或更低版本为目标平台。
如果以 Android 10 或更高版本为目标平台,请在应用的清单文件中将 requestLegacyExternalStorage 的值设为 true:

<manifest ... >
    <!-- This attribute is "false" by default on apps targeting
         Android 10 or higher. -->
    <application android:requestLegacyExternalStorage="true" ... >
      ...
    </application>
  </manifest>

注意:如果某个应用在安装时启用了传统外部存储,则该应用会保持此模式,直到卸载为止。无论设备后续是否升级为搭载 Android 10 或更高版本,或者应用后续是否更新为以 Android 10 或更高版本为目标平台,此兼容性行为均适用。

要测试以 Android 9 或更低版本为目标平台的应用在使用分区存储时的行为,您可以通过将 requestLegacyExternalStorage 的值设为 false 来选择启用该行为。

②访问媒体文件,使用 MediaStore。
③访问其他应用创建的任何其他文件,使用系统提供的存储访问框架

但各位可以在开发者文档中找到相关的解决方法
开发者帮助文档:有关 AndroidQ 的适配资料

华为开发者帮助文档:https://developer.huawei.com/consumer/cn/doc/50127

请注意,华为开发者帮助文档里边有些方法已经过时,测试版时使用的方法在正式版中可能无法使用,如
早期测试版本中引入的专门用于操作媒体文件的权限

  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    296 引用 • 311 回帖 • 503 关注

赞助商 我要投放

回帖
请输入回帖内容 ...