gpt4 book ai didi

android - 如何在没有系统确认对话框的情况下删除 Android 11 (API 30) 上的文件?

转载 作者:行者123 更新时间:2023-12-04 11:44:26 24 4
gpt4 key购买 nike

我有一个将视频录制到共享 MOVIES 文件夹的应用程序。
我可以使用 contentResolver.delete(uri, null, null) 在 Android 11 (API 30) 上删除这些文件我录制的视频 Activity 中的方法。
但是,如果我重新安装该应用程序,那么它就会失去对这些文件的权限......(如此糟糕),在这种情况下,我需要做这样的事情:

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 删除文件因为应用程序已重新安装并且存在异常,我们可以捕获并打开下一个恼人的对话框以供用户确认删除(并且对于每个文件删除,它应该是一个不同的对话框,多次删除 - 没办法)
enter image description here
然后我在这个 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
}
https://github.com/videolan/vlc-android/blob/master/application/vlc-android/src/org/videolan/vlc/util/FileUtils.kt#L240

最佳答案

Android 11 (API 30) 没有系统确认对话框你可以做,但你需要 manage_external_storage允许。某些特定类别的应用程序允许该权限。

  • 文件管理器
  • 备份和恢复应用程序
  • 杀毒软件
  • 文档管理应用程序
  • 设备上文件搜索
  • 磁盘和文件加密
  • 设备到设备数据迁移

  • Manage all files on a storage device
    如果您的应用不属于上述类别,则不允许使用 manage_external_storage 权限发布。
    如果您的应用程序是图库、视频和音频播放器,那么您不需要 manage_external_storage权限,您可以使用系统确认对话框直接将其删除。
    Here you can get the example to delete media file
    在 android 11 之前,您可以直接使用 file.delete() 方法并删除您的文件。
    在安卓 11 file.delete()方法仅在您创建自己的内容时才有效。例如,您的应用程序下载了一张图像,并且在此案例中的位置是外部存储 file.delete()方法。
    如果您想删除当时的相机或屏幕截图等媒体文件 file.delete()该方法在 android 11 中不起作用,因为您没有创建媒体内容。这种情况会出现一个系统确认对话框。

    关于android - 如何在没有系统确认对话框的情况下删除 Android 11 (API 30) 上的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64582269/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com