Android удалить файл со съемной SD-карты (второе внешнее хранилище) - PullRequest
0 голосов
/ 03 мая 2018

Я прочитал все темы на этом форуме, но у меня ничего не работает. У меня есть массив путей файлов, и мне нужно удалить некоторые из них. В своем коде я пытаюсь использовать:

    File file = new File(filesPath.get(0));
    file.delete();
    if (file.exists()) {
        try {
            file.getCanonicalFile().delete();
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (file.exists()) {
            file.getAbsoluteFile().delete();
        }
    }

    Log.e("MyLogs", file.exists() ? "true" : "false");

filesPath, который я получаю из MediaStore и выглядит как "/storage/extSdCard/mmm/bensound-summer.mp3". Я могу прочитать этот путь без каких-либо проблем, но я не могу удалить его. Вот мой код для получения строкового массива:

    ArrayList<String> filesPath = new ArrayList<>();

    Uri contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    String[] projection = {MediaStore.Images.Media.DATA};

    try {
        Cursor cursor = context.getContentResolver().query(
                contentUri,
                projection,
                MediaStore.Audio.Media.IS_MUSIC + " != 0",
                null,
                null);

        if (cursor != null && cursor.moveToFirst() && cursor.getCount() > 0) {

            do {

                String path = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
                File file = new File(path);
                if (file.exists())
                    filesPath.add(path);

            } while (cursor.moveToNext());

            return filesPath;

        } else {
            return null;
        }
    } catch (Exception ex) {
        ex.printStackTrace();
        return null;
    }

Конечно, я добавил разрешения для манифеста:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />    
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

С по этой ссылке Я взял некоторый код для себя, но он не помог мне решить мою проблему, поэтому я написал свой вопрос здесь.

EDIT:

Только что нашел смысл: я не могу удалить файлы с SDCard (съемные) !!! из хранилища decive все удаляется без проблем.

РЕДАКТИРОВАТЬ 2:

try {
    long id = -1;
    Cursor cursor = context.getContentResolver().query(
            MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
            new String[] { MediaStore.Audio.Media._ID },
            MediaStore.Audio.Media.DATA + "=?",
            new String[] { file.getAbsolutePath() },
            null);

    if (cursor != null && cursor.moveToFirst() && cursor.getCount() > 0) {
        id = cursor.getLong(cursor.getColumnIndex(MediaStore.MediaColumns._ID));
        cursor.close();
        Uri uri = Uri.withAppendedPath(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, String.valueOf(id));
        DocumentFile documentFile = DocumentFile.fromSingleUri(context, uri);
        if (documentFile.delete()) {
            Uri mediaContentUri = ContentUris.withAppendedId(
                    MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                    id
            );
            context.getContentResolver().delete(mediaContentUri, null, null);
        }
    }
} catch (Exception ex) {
    ex.printStackTrace();
}

Я получил ошибку исключения:

Failed to delete document
         java.lang.UnsupportedOperationException: Unsupported call: android:deleteDocument

ошибка указывает на строку documentFile.delete ()

Ответы [ 4 ]

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

это выглядит как "/storage/extSdCard/mmm/bensound-summer.mp3".

Затем этот файл находится на съемной карте micro SD.

Карты Micro SD предназначены только для вашего приложения на современных системах Android.

Вот почему вы не можете удалить этот файл из него.

Ну, не так, как вы пытаетесь сделать это сейчас.

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

Вы уверены, что получили разрешение WRITE_EXTERNAL_STORAGE в своем приложении перед удалением файла?

Поскольку вы уже можете получить доступ к файлу, не должно быть никаких других проблем, вызывающих метод delete. Кроме того, вы также можете проверить журнал cat, если есть какие-либо исключения, захваченные

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

Я надеюсь, что вы добавите ниже разрешения в файле манифеста Android ..

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

для удаления файла, используемого ниже кода.

File file = new File(selectedFilePath);
boolean deleted = file.delete();
0 голосов
/ 03 мая 2018

Первая проверка. Получили ли вы разрешение на чтение внешнего хранилища и запись на внешнее хранилище, затем

Вы можете удалить по этому коду ..

Вы можете просто использовать File.delete ()

File dir2 = new File(Environment.getExternalStorageDirectory() + "/Eraser/temp");

    File dir = new File(Environment.getExternalStorageDirectory() + "/Eraser/Capture");

    if (dir.isDirectory())
    {

        String[] children = dir.list();
        for (int i = 0; i < children.length; i++)
        {
            new File(dir, children[i]).delete();
        }
    }
    dir.delete();
    if (dir2.isDirectory())
    {

        String[] children = dir2.list();
        for (int i = 0; i < children.length; i++)
        {
            new File(dir2, children[i]).delete();
        }
    }

    dir2.delete();
...