2017-07-22 3 views
12

Ich versuche, eine Datei auf demkann nicht Datei aus dem externen Speicher in android löschen programmatisch

/storage/714D-160A/Xender/image/Screenshot_commando.png 

Pfad zu löschen, was ich bisher getan habe:

try{ 
     String d_path = "/storage/714D-160A/Xender/image/Screenshot_commando.png"; 
     File file = new File(d_path); 
     file.delete(); 

    }catch(Exception e){ 

     e.printStackTrace(); 
    } 

und die Datei ist noch an seinem Platz (nicht gelöscht :()

auch in Manifest-Datei die Erlaubnis gegeben, ich habe.

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.STORAGE" /> 
+0

Welchen Fehler erhalten Sie? Fügen Sie Ihre Logcat-Details hinzu. – huk

+0

Wenn Sie auf einem Gerät mit Android M oder höher testen, benötigen Sie eine Laufzeitberechtigung. –

+0

Ich teste auf einem Gerät mit Android M – Secret

Antwort

5
public static boolean delete(final Context context, final File file) { 
    final String where = MediaStore.MediaColumns.DATA + "=?"; 
    final String[] selectionArgs = new String[] { 
      file.getAbsolutePath() 
    }; 
    final ContentResolver contentResolver = context.getContentResolver(); 
    final Uri filesUri = MediaStore.Files.getContentUri("external"); 

    contentResolver.delete(filesUri, where, selectionArgs); 

    if (file.exists()) { 

     contentResolver.delete(filesUri, where, selectionArgs); 
    } 
    return !file.exists(); 
} 
+0

Funktioniert diese Methode mit Android-Geräten, die unter Android 5.0 und höher ausgeführt werden? – Rahulrr2602

+1

Ja, es ist Android 5,0 und höher. – Secret

+0

Vielen Dank. – Rahulrr2602

3

Verwenden Environment.getExternalStorageDirectory().getAbsolutePath() statt harter Codierung Speicherpfad

String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath(); 
File f = new File(baseDir + "/714D-160A/Xender/image/Screenshot_commando.png"); 
boolean d = f.delete(); 
+0

danke für Ihre Antwort, aber ich möchte externen Speicher (Memory Card) file.and boolean Rückkehr false löschen, ist die Datei immer noch an seinem Platz (nicht gelöscht) .. – Secret

+0

@Secret Hast du 'Environment.getExternalStorageDirectory(). getAbsolutePath()' anstelle von '/ storage' getestet? – SiSa

+0

ja ich test aber nicht für mich arbeiten ... @ SiSa – Secret

9

ContentResolver Verwendung von Medien, Dateien zu löschen, ist falsch und viele Probleme für den Benutzer bereitstellt.
Sie können keine Datei auf dem sd-card einfach durch das Löschen ihrer Daten aus dem ContentResolver auf Android-Versionen größer als Jelly Bean(4.3) löschen.
Es funktioniert nur auf Android-Versionen vor KitKat(4.4).
Deshalb Android-Team zur Verfügung gestellt DocumentProvider.

Warum contentResolver.delete(...) falsch ist?
1. auffüllt des sd-card
Wenn Sie versuchen, eine Mediendatei auf den sd-card durch die ContentResolver auf Android-Versionen löschen größer als 4,3, ist die tatsächliche Mediendatei wird unberührt bleiben, da der contentResolver.delete(...) Ansatz nur die Informationen entfernt (Name, Datum, Pfad ...) der Medien und Sie werden am Ende nicht registrierte Mediendateien auf Ihrem sd-card haben, die ContentResolver keine Ahnung mehr über ihre Existenz hat und deshalb konnten Sie sie in Ihrer Galerie nicht sehen und Sie denken, dass sie ' Sie wurden mit dieser Methode gelöscht, während sie noch da sind, und füllen die sd-card jedes Mal, wenn der Benutzer versucht, eine Mediendatei unter sd-card zu löschen.

2. Media-Dateien (Bilder, Videos, Gifs ...) wird in die Galerie zurück
Es gibt viele Anwendungen gibt, vor allem Galerie und Dateimanager diejenigen, die diese nicht registrierte Mediendateien finden und füge sie an die ContentResolver wieder als ihr normales Verhalten, während der Benutzer davon ausgeht, dass seine unerwünschten Mediendateien weg sind. Sicher kein Benutzer will seine/ihre angenommen gelöschten Bilder oder Videos zeigen sich mitten in einer Demonstration.

Also, was ist der richtige Ansatz, um Mediendateien auf dem sd-card zu entfernen?
Nun, dies wurde bereits here mit der Verwendung von DocumentProvider beantwortet.

+0

Die ursprüngliche Frage erwähnt nie ContentResolver. Warum konzentriert sich deine Antwort darauf? OH. Aha. Die akzeptierte Antwort verwendet containresolver. – Neo42

Verwandte Themen