【问题标题】:Getting RecoverableSecurityException while deleting file on Android API 29 and 30 with requestLegacyExternalStorage = true in AndroidManifest在 AndroidManifest 中使用 requestLegacyExternalStorage = true 在 Android API 29 和 30 上删除文件时获取 RecoverableSecurityException
【发布时间】:2021-02-14 15:22:40
【问题描述】:

下面是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。

【问题讨论】:

标签: android scoped-storage


【解决方案1】:

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

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

【讨论】:

  • 那么如何在android中删除文件?
  • @Himanshu:按照文档说明使用RecoverableSecurityException 获得许可。然后,如果用户授予权限,请重试您的删除操作。你的方法很好。你的问题是关于为什么你会收到RecoverableSecurityException
  • 其实我是想删除多个视频文件,怎么才能一次性获得所有文件的权限呢?
  • @Himanshu:在 Android 10 上,这不是一个选项。在 Android 11 上,您可以使用 MediaStore.createWriteRequest() 一次请求多个 Uri 值的权限。在this sample project中,我是在修改多个视频文件,而不是删除它们,但原理还是一样的。
  • 您在 android 11 上是对的,我们可以发出批量删除请求,但在 Android 11 以下,我试图通过提供 android:requestLegacyExternalStorage=true 禁用范围存储来实现它,但我得到了可恢复的安全异常。如果我做错了,请告诉我。
猜你喜欢
  • 1970-01-01
  • 2021-05-31
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 2021-04-12
  • 2021-03-18
  • 2021-11-27
  • 2012-12-08
相关资源
最近更新 更多