2016-01-15 12 views
10

Sto tentando di eliminare un file musicale tramite la mia app ma non riesco a farlo. Ive ha verificato conImpossibile eliminare il file con la classe File

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

se è vero e sì, lo sono. Questi metodi mi restituiscono vero. Ma quando vengo al metodo di eliminazione:

boolean deleted = temp.delete(); 

Esso restituisce me False e il file non è sempre cancellato. Non ci sono eccezioni, solo un falso ritorno alla mia variabile cancellata.

Im anche utilizzando questi permissons:

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

Qualcuno è venuta un'idea per una soluzione? (o altre classi che posso usare?)

Edit: thats il mio codice completo

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

(E ho controllato mentre debuging se l'oggetto ha il suo percorso in esso e hanno)

+1

Cosa indica esattamente "temp"? Qual è il percorso? Come hai creato l'oggetto 'File'? – CommonsWare

+0

Si prega di inviare più del vostro codice - – Zain

+0

Ho aggiornato il mio post. Puoi vedere ora l'intero codice del mio processo di cancellazione nella sezione Modifica: –

risposta

0

Dato che stai verificando che il file esista, ci può essere solo una ragione per cui non puoi cancellare il file: non hai i permessi per farlo.

Un'app non può eliminare file di sistema o file di altre app.

+0

Ma come fanno le altre app di Music Player a farlo? Tutti i permissoni di cui ho bisogno li ho usati nel mio manifest vero? –

+0

Puoi darmi un esempio di cosa stai cercando di cancellare? Solo i percorsi di alcuni file. –

+0

/storage/extSdCard/Musik/neverlie_look.mp3 –

2

Il percorso dal tuo commento sembra che il file si trovi su una scheda SD rimovibile. Hai bisogno di permessi speciali su Android 4.4+ per gestire o eliminare file su una scheda SD. Dovrai utilizzare DocumentFile#delete().

Per informazioni accedere ai file su una scheda SD rimovibile utilizzando DocumentFile vedere il seguente StackOverflow postale:

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


C'è anche un hack che potrebbe funzionare senza l'utilizzo di DocumentFile come spiegato dallo sviluppatore di FX file manager qui: http://forum.xda-developers.com/showpost.php?p=52151865

+0

Che cos'è "ContentUriUtil" nell'hack? –

0

si supponga che il percorso del file è

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

eliminare in questo modo

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

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

se si desidera eliminare tutti i file nella cartella musicale farlo

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

eliminare la musica file che si deve fare due compiti:

  1. Elimina file in Archiviazione.

    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. Elimina file da 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}); 
          } 
         } 
        } 
    } 
    

È possibile ripristinare/MediaStore nuova scansione, invece di fare un po 'codice di cui sopra.

Nota: Se si elimina dalla scheda SD e Android 4,4 +

Cambia Android 4.4+: Apps non sono autorizzati a scrivere (cancellare, modificare ...) per storage esterno, tranne per le loro directory specifiche del pacchetto.

+0

Ma il problema che non capisco è come le altre app lo fanno? Ive ha provato fuori non posso cancellare un file specifico da extern ma l'app Shuffler per esempio può cancellarlo. –

Problemi correlati