it-swarm.com.de

Wie lösche ich Dateien programmgesteuert auf Android?

Ich bin auf 4.4.2 und versuche, eine Datei (Bild) über URI zu löschen. Hier ist mein Code:

File file = new File(uri.getPath());
boolean deleted = file.delete();
if(!deleted){
      boolean deleted2 = file.getCanonicalFile().delete();
      if(!deleted2){
           boolean deleted3 = getApplicationContext().deleteFile(file.getName());
      }
}

Derzeit löscht keine dieser Löschfunktionen die Datei. Ich habe dies auch in meiner AndroidManifest.xml:

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

Warum testen Sie das nicht mit diesem Code:

File fdelete = new File(uri.getPath());
if (fdelete.exists()) {
    if (fdelete.delete()) {
        System.out.println("file Deleted :" + uri.getPath());
    } else {
        System.out.println("file not Deleted :" + uri.getPath());
    }
}

Ich denke, ein Teil des Problems ist, dass Sie nie versuchen, die Datei zu löschen, sondern einfach eine Variable mit einem Methodenaufruf erstellen.

In Ihrem Fall könnten Sie also versuchen:

File file = new File(uri.getPath());
file.delete();
if(file.exists()){
      file.getCanonicalFile().delete();
      if(file.exists()){
           getApplicationContext().deleteFile(file.getName());
      }
}

Ich denke jedoch, das ist ein wenig übertrieben.

Sie haben einen Kommentar hinzugefügt, dass Sie ein externes Verzeichnis anstelle eines URI verwenden. Fügen Sie stattdessen Folgendes hinzu:

String root = Environment.getExternalStorageDirectory().toString();
File file = new File(root + "/images/media/2918"); 

Versuchen Sie dann, die Datei zu löschen.

85

Probier diese. Es funktioniert für mich.

handler.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                // Set up the projection (we only need the ID)
                                String[] projection = { MediaStore.Images.Media._ID };

// Match on the file path
                                String selection = MediaStore.Images.Media.DATA + " = ?";
                                String[] selectionArgs = new String[] { imageFile.getAbsolutePath() };

                                // Query for the ID of the media matching the file path
                                Uri queryUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                                ContentResolver contentResolver = getActivity().getContentResolver();
                                Cursor c = contentResolver.query(queryUri, projection, selection, selectionArgs, null);
                                if (c.moveToFirst()) {
                                    // We found the ID. Deleting the item via the content provider will also remove the file
                                    long id = c.getLong(c.getColumnIndexOrThrow(MediaStore.Images.Media._ID));
                                    Uri deleteUri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id);
                                    contentResolver.delete(deleteUri, null, null);
                                } else {
                                    // File not found in media store DB
                                }
                                c.close();
                            }
                        }, 5000);
14
Krishna

Ich habe diesen Code auf dem Nougat-Emulator getestet und es hat funktioniert:

Im Manifest hinzufügen:

<application...

    <provider
        Android:name="Android.support.v4.content.FileProvider"
        Android:authorities="${applicationId}.provider"
        Android:exported="false"
        Android:grantUriPermissions="true">
        <meta-data
            Android:name="Android.support.FILE_PROVIDER_PATHS"
            Android:resource="@xml/provider_paths"/>
    </provider>
</application>

Erstellen Sie einen leeren XML-Ordner im Ordner "res" und fügen Sie ihn in die Datei "provider_paths.xml" ein:

<?xml version="1.0" encoding="utf-8"?>
 <paths xmlns:Android="http://schemas.Android.com/apk/res/Android">
   <external-path name="external_files" path="."/>
  </paths>

Fügen Sie dann das nächste Snippet in Ihren Code ein (zum Beispiel Fragment):

File photoLcl = new File(homeDirectory + "/" + fileNameLcl);
Uri imageUriLcl = FileProvider.getUriForFile(getActivity(), 
  getActivity().getApplicationContext().getPackageName() +
    ".provider", photoLcl);
ContentResolver contentResolver = getActivity().getContentResolver();
contentResolver.delete(imageUriLcl, null, null);
7
CodeToLife

Ich sehe, Sie haben Ihre Antwort gefunden, aber es hat bei mir nicht funktioniert. Delete gab immer wieder false zurück, daher habe ich Folgendes versucht und es hat funktioniert (für alle anderen, für die die gewählte Antwort nicht funktioniert hat):

System.out.println(new File(path).getAbsoluteFile().delete());

Der Systemausgang kann natürlich ignoriert werden, ich habe ihn zum bequemen Bestätigen des Löschvorgangs angegeben.

4
Arijit