2010-12-13 6 views
18

insertar una imagen a través de:archivo Android eliminar deja marcador de posición vacío en la Galería

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

Pero cuando intento eliminar

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

La imagen ya no está allí, sino un marcador de posición vacío es. ¿Algunas ideas?

Respuesta

14

Android tiene un tipo de memoria caché que realiza un seguimiento de los archivos multimedia.

Prueba esto:

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

Se hace funcionar el servicio MediaScanner nuevo, que debe quitar la imagen borrada de la memoria caché del dispositivo.

Parece que también hay que añadir este permiso a sus AndroidManifest.xml:

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

Eso funcionó, gracias! – Paul

+1

enorme recurso cerdo –

+0

@aloneguid, ¿te importa explicar por qué? –

6

También puede borrar la imagen de la Galería mediante el uso de:.

getContentResolver() borrar (imageUri, nulo, nulo);

Solo asegúrese de que 'imageUri' es el uri que le devolvieron cuando llamó a insert.

+1

Sigo recibiendo errores de "URL desconocida". ¿Estás pasando la ruta completa con la raíz del teléfono o solo la ruta de nivel superior? Intenté ambos y sigo obteniendo el error de URL desconocido. No puedo mantener una base de datos del URI de inserción de cuando agregué el archivo a la galería. ¿Puedo eliminar el elemento de la galería simplemente usando una ruta de archivo que sé que es válida? Puedo agregar elementos a la galería usando el escáner de medios, pero no puedo eliminar un elemento después de que se elimine el archivo. – user1017063

+0

¿este método elimina la imagen real de la galera o simplemente oculta la imagen con esta ruta desde la galería? – hadi

+0

esto funciona para imageUri = "content: ...." uri-s pero no para "file: ...." urils – k3b

2

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

Esto funcionó para mí (probado en 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

Como se indica en los comentarios, la respuesta aceptada utiliza una gran cantidad de memoria. Si bien MediaScannerConnection no tiene un método "deleteFile", simplemente ingrese la ruta del archivo anterior al método "scanFile" una vez que haya eliminado el archivo. El escáner de medios volverá a explorar y eliminará los medios.

probado en N5. Android 4.4.

EDIT:. Otros han declarado este no funciona en 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

¡Esto es mejor que usar la transmisión Intent.ACTION_MEDIA_MOUNTED! –

+1

Esto no funciona en Android 4.2 – Praveen

+0

hice esto en Android 4.2 y no funcionó. ¿este problema es solo para Android por debajo de 4.4 ver? – hadi

1

Utilice este método getContentResolver() borrar (MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
MediaStore.Images.Media._ID + "=?", new String [] {Long.toString (id)});

+0

¿Cuál debería ser el valor de "id"? – Sebek

3

Cuando no tiene conocer la imagen-id como se requiere en la respuesta de @manisha y @Muhammad Waqas Khan también se puede eliminar por nombre de archivo

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

[Actualización 16/06/2016]

Peligro: Parece que "Borre solamente el elemento del mediaDB". Dado que hay un SQLite-cascade-file-delete-trigger en el mediaDB, el archivo de referencia también se elimina si existe.

Para evitar esto, debe cambiar la columna MediaStore.Images.Media.DATA por una ruta de archivo no existente antes de llamar a eliminar.

0

añadir esta línea después de File.delete();:

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