Не удается удалить файл с помощью класса File

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

boolean exists = temp.exists();
boolean isFile = temp.isFile();

если это правда, и да, они есть. Эти методы верны мне. Но когда я прихожу к методу delete:

boolean deleted = temp.delete();

Он возвращает меня False, и файл не удаляется. Нет Исключения генерирует только ложное возвращение к моей удаленной переменной.

Im также использует эти разрешения:

<uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.ACTION_HEADSET_PLUG"/>

Кто-то получил Идею для решения? (Или другие классы, которые я могу использовать?)

Изменить: Это мой полный код

File temp = new File(str_path);

boolean exists = temp.exists();
boolean isFile = temp.isFile();

if (exists)) {
    boolean deleted = temp.delete();
    if (deleted) {
        Toast.makeText(context, "Successful deleted " + Title_Artist, Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(context, "Not able to delete file " + Title_Artist, Toast.LENGTH_SHORT).show();
            }
        }

(И я проверил при отладке, если объект имеет свой путь в нем, и он имеет его)

Ответ 1

Удалите музыкальную музыку, которую вы должны выполнить две задачи:

  • Удалить файл в хранилище.

    public static boolean delete(File path) {
        boolean result = true;
        if (path.exists()) {
            if (path.isDirectory()) {
                for (File child : path.listFiles()) {
                    result &= delete(child);
                }
                result &= path.delete(); // Delete empty directory.
            }
            if (path.isFile()) {
            result &= path.delete();
            }
            if (!result) {
                Log.e("Delete", "Delete failed;");
            }
            return result;
        } else {
            Log.e("Delete", "File does not exist.");
            return false;
        }
    }
    
  • Удалить файл из MediaStore:

    public static void deleteFileFromMediaStore(final ContentResolver contentResolver, final File file) {
        int sdk = android.os.Build.VERSION.SDK_INT;
        if (sdk >= android.os.Build.VERSION_CODES.HONEYCOMB) {
           String canonicalPath;
           try {
               canonicalPath = file.getCanonicalPath();
           } catch (IOException e) {
               canonicalPath = file.getAbsolutePath();
           }
           final Uri uri = MediaStore.Files.getContentUri("external");
           final int result = contentResolver.delete(uri,
                    MediaStore.Files.FileColumns.DATA + "=?", new String[]{canonicalPath});
           if (result == 0) {
               final String absolutePath = file.getAbsolutePath();
               if (!absolutePath.equals(canonicalPath)) {
                contentResolver.delete(uri,
                        MediaStore.Files.FileColumns.DATA + "=?", new String[]{absolutePath});
                }
            }
        }
    }
    

Вы можете reset/rescan MediaStore вместо кода выше.

Примечание. Если вы удаляете с SD-карты и Android 4.4 +

Изменить для Android 4.4 +: приложениям запрещено писать (удалять, изменять...) на внешнее хранилище, за исключением каталогов конкретных пакетов.

Ответ 2

Путь из вашего комментария выглядит так, как будто файл находится на съемной SD-карте. Для управления или удаления файлов на SD-карте необходимы специальные разрешения для Android 4.4+. Вам нужно будет использовать DocumentFile#delete().

Для получения справки о доступе к файлам на съемной SD-карте с помощью DocumentFile см. следующий пост StackOverflow:

Как использовать новый API доступа к SD-карте, представленный для Android 5.0 (Lollipop)?


Существует также хак, который может работать без использования DocumentFile, как объясняется разработчиком файлового менеджера FX здесь: http://forum.xda-developers.com/showpost.php?p=52151865

Ответ 3

Поскольку вы проверяете, что файл существует, может быть только одна причина, по которой вы не можете удалить файл: у вас нет прав для этого.

Приложение не может удалять системные файлы или файлы других приложений.

Ответ 4

Предположим, что ваш путь к файлу

Environment.getExternalStorageDirectory().getPath()
                        + "/Music"
                        + "/"
                        + "song.mp3"

удалите его так:

File dir = new File(Environment.getExternalStorageDirectory()
                        .getPath()
                        + "/Music");

if (dir.isDirectory()) {new File(dir, song.mp3).delete();}

если вы хотите удалить все файлы в папке с музыкой, сделайте это

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