У меня есть приложение, которое записывает видео в общую папку MOVIES.
Я могу удалить эти файлы на Android 11 (API 30) с помощью метода contentResolver.delete(uri, null, null)
в моей записи видео.
Но если я переустановлю приложение, оно потеряет права доступа к этим файлам ... (так что жаль), и в этом случае мне нужно сделать что-то вроде этого:
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
, потому что приложение было переустановлено, и есть исключение, которое мы можем поймать и открыть следующий раздражающий диалог для пользователя, чтобы подтвердить удаление (и для каждого удаления файла это должен быть другой диалог, многократное удаление - ни за что)
Затем я установил приложение Explorer из Google Play на это устройство Android 11 (эмулятор), когда я его открыл, приложение запрашивало только разрешение на запись в хранилище (мое приложение также делает это), и это приложение Explorer могло легко удалить любой файл (включая мои записи видео файлы) без какого-либо диалогового окна подтверждения.
Так как они это делают? Это взлом или что это?
Ссылка на приложение https://play.google.com/store/apps/details?id=com.speedsoftware.explorer.
Обновить
VLC для 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
}
Context.getExternalMediaDirs
, но видео удаляются, если приложение удаляется, и возникают другие проблемы, когда разные приложения (например, видеоплееры) не могут получить доступ к этим видео (не будут сканировать). Но я вижу, что VLC может легко удалить файл на Android 11, как они это делают? - person user25   schedule 29.10.2020MANAGE_EXTERNAL_STORAGE
разрешение и публикация обновления в Google Play? - person user25   schedule 29.10.2020ContentResolver#checkUriPermission(Uri, int, int)
, но я не могу найти этот метод в _2 _... developer.android.com/reference/android/provider/ - person user25   schedule 21.11.2020Context
естьcheckUriPermission()
. - person CommonsWare   schedule 21.11.2020