【发布时间】:2021-02-11 08:59:40
【问题描述】:
我有一个将视频录制到共享 MOVIES 文件夹的应用程序。
我可以在我录制的视频活动中使用contentResolver.delete(uri, null, null) 方法在 Android 11 (API 30) 上删除这些文件。
但是如果我重新安装应用程序,那么它会失去对这些文件的权限......(非常糟糕),在这种情况下,我需要做这样的事情:
try {
context.contentResolver.delete(uri, null, null)
} catch (exception: Exception) {
if (exception is RecoverableSecurityException) {
val intentSender = exception.userAction.actionIntent.intentSender
intentSender?.let {
callback?.startIntentSenderForResult(
intentSender,
requestCode
)
}
}
}
所以它无法使用ContentResolver 删除文件,因为重新安装了应用程序并且我们可以捕获并打开下一个烦人的对话框以供用户确认删除(并且对于每个文件删除它应该是不同的)对话框,多次删除——没办法)
然后我在这个 Android 11 设备(模拟器)上安装了来自 Google Play 的 Explorer 应用程序,当我打开它时,该应用程序只要求存储写入权限(我的应用程序也这样做)并且这个 Explorer 应用程序可以轻松删除任何文件(包括我录制的视频文件)没有任何确认对话框。
那么他们是怎么做到的呢?是黑客攻击还是那是什么?
链接到应用程序https://play.google.com/store/apps/details?id=com.speedsoftware.explorer
更新
VLC for Android 也可以删除任何媒体文件https://play.google.com/store/apps/details?id=org.videolan.vlc
他们也使用内容提供程序,所以它是相同的,但它返回 true 不像我的应用程序,为什么?
fun deleteFile(file: File): Boolean {
var deleted: Boolean
//Delete from Android Medialib, for consistency with device MTP storing and other apps listing content:// media
if (file.isDirectory) {
deleted = true
for (child in file.listFiles()) deleted = deleted and deleteFile(child)
if (deleted) deleted = deleted and file.delete()
} else {
val cr = AppContextProvider.appContext.contentResolver
try {
deleted = cr.delete(MediaStore.Files.getContentUri("external"),
MediaStore.Files.FileColumns.DATA + "=?", arrayOf(file.path)) > 0
} catch (ignored: IllegalArgumentException) {
deleted = false
} catch (ignored: SecurityException) {
deleted = false
}
// Can happen on some devices...
if (file.exists()) deleted = deleted or file.delete()
}
return deleted
}
【问题讨论】:
-
请求所有文件访问的应用程序 - 就像文件管理器一样 - 可以使用标准 File 类删除所有文件。无需使用内容解析器或媒体存储。无需询问用户。
-
@blackapps 他们如何请求此类访问权限? VLC for Android 也可以轻松删除文件(它不是文件管理器)
-
Android 11 会出现批量删除,不是已经有了吗?
-
"可以使用 MANAGE_EXTERNAL_STORAGE 权限并在 Google Play 上发布更新吗?" ——我没有办法回答这个问题。 “但我仍然想在没有任何对话框的情况下删除视频文件”——你已经在这样做了。您的问题是,如果用户卸载您的应用,然后重新安装您的应用,您无法从应用中删除任何旧录音。恕我直言,你想多了一个不常见的事件。只需告诉用户“嘿,您已卸载并重新安装,因此我们需要您的帮助来清理旧录音”,然后使用存储访问框架。
-
@CommonsWare 据说有
ContentResolver#checkUriPermission(Uri, int, int)但我在ContentResolver...developer.android.com/reference/android/provider/… 找不到这个方法
标签: android android-file android-storage android-11