首页 > 解决方案 > 在 AndroidManifest 中使用 requestLegacyExternalStorage = true 在 Android API 29 和 30 上删除文件时获取 RecoverableSecurityException

问题描述

下面是 AndroidManifest 文件代码

<application
    android:name=".application.SomeApp"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:largeHeap="true"
    android:networkSecurityConfig="@xml/network_config"
    android:hardwareAccelerated="true"
    android:resizeableActivity="true"
    android:requestLegacyExternalStorage="true"
    android:theme="@style/THEME_DEFAULT_BLUE_ACCENT">

删除文件代码

val result = CommonApp.getContext().contentResolver.delete(fileForAction.uri,
                        "${MediaStore.MediaColumns._ID} = ?", arrayOf(fileForAction.id.toString()))
                if(result > 0){ successDeleted++ } else { failedDeleted++ }

在上面的代码中 fileForAction.uri 是特定的视频文件 uri 示例:“content://media/external/video/media/23”

我已经在 Android API 级别 29 和 30 上对此进行了测试。但是得到 android.app.RecoverableSecurityException: com.packagename.someapp 无法访问 content://media/external/video/media/23

正如我在本文档中所读到的那样https://developer.android.com/training/data-storage/shared/media#remove-item

如果作用域存储不可用或未启用,我们可以删除其他应用程序拥有的文件,而无需处理 RecoverableSecurityException。

标签: androidscoped-storage

解决方案


为什么当我选择通过在 AndroidManifest 中提供 android:requestLegacyExternalStorage = true 来禁用范围存储时,我在删除文件时收到 RecoverableSecurityException

您没有删除文件。您正在删除MediaStore代表一段内容的条目。android:requestLegacyExternalStorage = "true"与从中删除条目无关MediaStore


推荐阅读