Qt for Android(十一) —— Android 10 适配外部存储权限

1,048 阅读1分钟

这是我参与8月更文挑战的第10天,活动详情查看:8月更文挑战

背景

  之前我们的项目一直是运行在Android5.1和Android7.1.2的系统下,后面有新的需求呀要运行在Android 10下面,当时不知道有多少坑,以为只需要简单的适配即可。但由于我们的应用有一些特殊的需求(后面会提到),因此适配过程中还是有不少坑。

问题

  从Android Q(即 Android 10)开始,应用访问外部存储的私有目录(即Context.getExternalFilesDir())不需要申请READ_EXTERNAL_STORAGE 或 WRITE_EXTERNAL_STORAGE权限,该空间内的数据为应用独有。而且就算应用申请了,也只能访问外部存储的私有目录(即APP包内部目录),若是访问了除了私有目录之外的其他外部储存(如/sdcard/目录),会抛出java.io.FileNotFoundException异常。

解决办法

一、 在AndroidManifest.xml的Application节点设置android:requestLegacyExternalStorage="true"

source.android.google.cn/devices/sto…

  官方描述:从 Android 10 开始,以 Android 9 及更低版本为目标平台的应用默认使用旧版存储,并且可以选择使用隔离存储。以 Android 10 为目标平台并默认使用隔离存储的应用可以暂时选择停用隔离存储。使用控制存储模型的清单属性 requestLegacyExternalStorage 可更改默认状态。

即Android提供了requestLegacyExternalStorage机制,来帮助应用过渡,使用原来的机制继续读写存储卡(注意这只是个过渡属性,不能保证在未来的哪个版本会被移除)。

二、如果是媒体集合(照片、视频、音频),使用MediaStore。详情查阅:developer.android.google.cn/training/da…