Android: удалить изображение на SD-карте - PullRequest
0 голосов
/ 03 мая 2018

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();
    }
}

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Я стою правильно. В N отсутствует MediaStore.getDocumentUri(Context context, Uri mediaUri), который обеспечивает преобразование фиктивных путей к файлам для каталога DCIM в Oreo + в URI Storage Access Framework, который можно использовать для удаления файла. N, кажется, не дает эквивалента, который я могу найти. И содержание: Uris для медиа-файлов не работает с Storage Access Framework, если не преобразовано.

0 голосов
/ 03 мая 2018

) «Хранилище / 4ED7-7F17 / DCIM / Камера / ...» завершается ошибкой в ​​file.canWrite ().

Да, конечно. Карты Micro SD только для чтения на современных системах Android.

Приложения в настоящее время могут записывать только в один каталог приложений на SD-карте.

Если вы хотите получить доступ на запись ко всей карте, вам нужно использовать Storage Access Framework.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...