2010-12-13 6 views
18

insérer une image via:fichier Android supprimer laisse espace réservé vide dans la Galerie

ContentValues values = new ContentValues(); 
    values.put(Images.Media.TITLE, filename); 
    values.put(Images.Media.DATE_ADDED, System.currentTimeMillis()); 
    values.put(Images.Media.MIME_TYPE, "image/jpeg"); 

    Uri uri = this.getContentResolver().insert(Images.Media.EXTERNAL_CONTENT_URI, values); 

Mais quand je tente de supprimer

File f = new File(imageURI); 
    f.delete(); 

L'image n'est plus là, mais un espace réservé vide est. Des idées?

Répondre

14

Android dispose d'un cache de sorte à assurer le suivi des fichiers multimédias.

Essayez ceci:

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory()))); 

Il fait à nouveau la course de service MediaScanner, qui devrait supprimer l'image supprimée du cache de l'appareil.

On dirait que vous devez également ajouter cette autorisation à votre AndroidManifest.xml:

<intent-filter> 
    <action android:name="android.intent.action.MEDIA_MOUNTED" /> 
    <data android:scheme="file" /> 
</intent-filter> 
+0

Cela a fonctionné, merci! – Paul

+1

énorme ressource hog –

+0

@aloneguid, soin d'expliquer pourquoi? –

6

Vous pouvez également supprimer l'image de la galerie en utilisant:.

getContentResolver() supprimer (imageUri, null Null);

Assurez-vous simplement que 'imageUri' est l'uri qui vous a été retourné lorsque vous avez appelé l'insertion.

+1

Je continue d'obtenir des erreurs "URL inconnues". Passez-vous le chemin complet avec la racine du téléphone ou juste le chemin du niveau supérieur? J'ai essayé les deux et continuer à obtenir l'erreur d'URL inconnue. Je ne suis pas en mesure de maintenir une base de données de l'insert URI lorsque j'ai ajouté le fichier à la galerie. Puis-je supprimer l'élément de la galerie en utilisant simplement un chemin de fichier que je connais est valide? Je suis en mesure d'ajouter des éléments à la galerie à l'aide du scanner de support, mais je ne peux pas supprimer un élément après la suppression du fichier. – user1017063

+0

cette méthode supprime-t-elle l'image réelle de l'office ou cache-t-elle simplement l'image avec ce chemin de la galerie? – hadi

+0

cela fonctionne pour imageUri = "contenu: ...." uri-s mais pas pour "fichier: ...." urils – k3b

2

Extrait de: http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/content/ExternalStorage.html

Cela a fonctionné pour moi (testé sur HTC Desire, Android 2,3)

// Tell the media scanner about the new file so that it is 
// immediately available to the user. 
MediaScannerConnection.scanFile(this,new String[] { file.toString() }, null, 
new MediaScannerConnection.OnScanCompletedListener() { 
public void onScanCompleted(String path, Uri uri) { 
Log.i("ExternalStorage", "Scanned " + path + ":"); 
Log.i("ExternalStorage", "-> uri=" + uri); 
} 
}); 
8

Comme indiqué dans les commentaires, la réponse acceptée utilise beaucoup de mémoire. Bien que MediaScannerConnection n'ait pas de méthode "deleteFile", il suffit de passer l'ancien chemin du fichier à la méthode "scanFile" une fois que vous avez supprimé le fichier. Le scanner de support va effectuer une nouvelle analyse et retirer le support.

testé sur N5. Android 4.4.

EDIT:. D'autres ont dit cela ne fonctionne pas sur 4,2

new AsyncTask<Void, Void, Void>(){ 
     @Override 
     protected Void doInBackground(Void... params) { 
      String filePath = recording.file.getAbsolutePath(); 
      recording.file.delete(); 
      MediaScannerConnection.scanFile(context, 
        new String[]{filePath}, null, null); 
      return null; 
     } 
    }.execute(); 
+0

C'est mieux que d'utiliser la diffusion Intent.ACTION_MEDIA_MOUNTED! –

+1

Cela ne fonctionne pas dans Android 4.2 – Praveen

+0

je l'ai fait sur Android 4.2 et cela n'a pas fonctionné. est ce problème seulement pour android ci-dessous 4.4 ver? – hadi

1

Utilisez cette méthode getContentResolver() supprimer (MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
MediaStore.Images.Media._ID + "=?", new String [] {Long.toString (id)});

+0

quelle devrait être la valeur de "id"? – Sebek

3

Si vous donot savoir l'image-id au besoin dans la réponse de @manisha et @Muhammad Waqas Khan, vous pouvez également supprimer par nom de fichier

String fullPathToFile = "/storage/sdcard0/DICM/test.jpg"; 
    getContentResolver().delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
     MediaStore.Images.Media.DATA + "=?", new String[]{ fullPathToFile }); 

[Mise à jour 16/06/2016]

Danger: cela ressemble à "Supprimer uniquement l'élément de mediaDB". Étant donné qu'il existe un déclencheur SQLite-cascade-file-delete dans mediaDB, le fichier référencé est également supprimé s'il existe.

Pour éviter cela, vous devez remplacer la colonne MediaStore.Images.Media.DATA par un chemin de fichier inexistant avant d'appeler la suppression.

0

Ajouter cette ligne après File.delete();:

MediaScannerConnection.ScanFile(this,new string[]{fileUrl.ToString()}, null, null); 
Questions connexes