Android 7.0, API 24. Разрешения предоставляются как в AndroidManifest, так и в режиме реального времени.
Ниже приведены сценарии, которые я пробовал:
- Только при использовании преобразователя содержимого он удаляется из MediaStore, но возвращается после перезагрузки устройства.
- При удалении внутреннего изображения "/ Хранилище / Эмуляция / 0 / DCIM / Камера / ..."
это работает, но при попытке удалить внешнее изображение (или что должно
быть внешним изображением) "/ storage / 4ED7-7F17 / DCIM / Camera / ..."
file.canWrite ().
- Использование
Environment.getExternalStorageDirectory().getAbsolutePath()
возвращает "/storage/emulated/0" (+ "/DCIM/Camera/...")
, и происходит сбой в file.exists ().
- Жесткое кодирование
"/SD card/DCIM/Camera/..."
(который должен быть правильным путем к файлу) завершается ошибкой в file.exists ().
Как ни странно, в Проводнике файлов устройства Android файлы, которые должны находиться в папке SD-карты, находятся в папке "/ storage / 4ED7-7F17 /", для которой у файлов есть список разрешений -rwxrwx - x. И разрешение внутри "/ storage / emulated /" равно "Permission denied". Но чтобы найти файлы в приложении Android MyFiles или Windows File Explorer, файлы находятся в папке "/ SD-карта / DCIM / Camera /...".
Полностью запутанный, любая помощь будет принята с благодарностью.
File file = new File(filename);
if (file.exists()) {
if (file.canWrite()) {
if (file.delete()) {
// Set up the projection (we only need the ID)
String[] projection = {MediaStore.Files.FileColumns._ID};
// Match on the file path
String selection = MediaStore.Files.FileColumns.DATA + " = ?";
String[] selectionArgs = new String[]{filename};
Uri queryUri;
if (isVideo) {
// Query for the ID of the media matching the file path
queryUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else {
// Query for the ID of the media matching the file path
queryUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
}
ContentResolver contentResolver = context.getContentResolver();
Cursor c = contentResolver.query( queryUri, projection, selection, selectionArgs, null);
if (c.moveToFirst()) {
// We found the ID. Deleting the item via the content provider will also remove the file
long id = c.getLong(c.getColumnIndexOrThrow(MediaStore.Files.FileColumns._ID));
Uri deleteUri = ContentUris.withAppendedId(
MediaStore.Files.getContentUri("external"), id);
contentResolver.delete(deleteUri, null, null);
} else {
// File not found in media store DB
Toast.makeText(context, "File not found: " + filename,
Toast.LENGTH_LONG).show();
}
c.close();
Toast.makeText(context, "File deleted: " + filename,
Toast.LENGTH_LONG).show();
} else {
Toast.makeText(context, "File not deleted: " + filename,
Toast.LENGTH_LONG).show();
}
} else {
Toast.makeText(context, "File cannot be wrote to: " + filename,
Toast.LENGTH_LONG).show();
}
} else {
Toast.makeText(context, "File does not exist: " + filename,
Toast.LENGTH_LONG).show();
}
}