2016-01-15 17 views
10

Próbuję usunąć plik muzyczny przez moją aplikację, ale nie mogę tego zrobić. Ive sprawdzane zNie można usunąć pliku z klasą pliku

, jeśli są prawdziwe i tak, są. Te metody zwracają mi prawdę. Ale kiedy przychodzą do metody kasowania:

boolean deleted = temp.delete(); 

Zwraca mi fałsz, a plik nie jest uzyskiwanie usunięte. Nie ma wyjątków wyrzuca tylko fałszywy powrót do mojej usuniętej zmiennej.

Im również przy wykorzystaniu tych sekcji publicznej:

<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"/> 

Ktoś dostał pomysł na rozwiązanie? (lub inne klasy mogą używać?)

Edit: Ów mój pełny kod

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

(I sprawdzone podczas debuging jeśli obiekt ma swoją ścieżkę w nim i go mieć)

+1

Na co dokładnie wskazuje 'temp'? Jaka jest ścieżka? Jak stworzyłeś obiekt 'File'? – CommonsWare

+0

Proszę napisać więcej kodu - – Zain

+0

Zaktualizowałem swój post. Teraz możesz zobaczyć cały kod mojego procesu usuwania w sekcji Edycja: –

Odpowiedz

0

Ponieważ sprawdzasz, że plik istnieje, istnieje tylko jeden powód, dla którego nie możesz usunąć pliku: nie masz uprawnień, aby to zrobić.

Aplikacja nie może usuwać plików systemowych ani plików innych aplikacji.

+0

Ale jak robią to inne aplikacje odtwarzacza muzyki? Wszystkie pozwolenia, których potrzebuję, użyte w moim manifeście, prawda? –

+0

Czy możesz podać przykład tego, co próbujesz usunąć? Tylko ścieżki kilku plików. –

+0

/storage/extSdCard/Musik/neverlie_look.mp3 –

2

Ścieżka z Twojego komentarza wygląda jak plik na wymiennej karcie SD. Aby zarządzać lub usuwać pliki na karcie SD, musisz mieć specjalne uprawnienia do Androida 4.4+. Będziesz musiał użyć DocumentFile#delete().

uzyskać pomoc dostępu do plików na wymiennej karcie SD przy użyciu DocumentFile patrz poniższy StackOverflow wpis:

How to use the new SD card access API presented for Android 5.0 (Lollipop)?


Istnieje również hack, który może pracować bez użycia DocumentFile Jak wyjaśnił dewelopera Menedżer plików FX tutaj: http://forum.xda-developers.com/showpost.php?p=52151865

+0

Co to jest "ContentUriUtil" w hackowaniu? –

0

Załóżmy, że ścieżka do pliku to

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

usunąć go jak ten

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

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

jeśli chcesz usunąć wszystkie pliki w folderze muzycznym zrobić

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

Usuń muzykę plików trzeba wykonać dwa zadania:

  1. Usuń plik w magazynie.

    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; 
        } 
    } 
    
  2. plik usunąć z 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}); 
          } 
         } 
        } 
    } 
    

Można zresetować/ReScan Mediastore zamiast robić powyżej kodu.

Uwaga: Jeśli usuniesz z karty SD i Android 4,4 +

Change dla Androida 4.4+: Aplikacje nie mogą pisać (usuwać, modyfikować ...) do zewnętrznej pamięci masowej z wyjątkiem ich katalogi specyficzne dla pakietu.

+0

Ale problemem, którego nie rozumiem, jest to, jak robią to inne aplikacje? Ive wypróbowane to nie mogę usunąć określonego pliku z zewnątrz, ale aplikacja Shuffler na przykład może go usunąć. –

Powiązane problemy