2011-07-15 33 views
12

Necesito eliminar una imagen de la tarjeta SD elegida por el usuario. En mi actividad, después de que un usuario seleccione una imagen de la galería, que ejecuta este código:Android: eliminar una imagen de la tarjeta SD

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == RESULT_OK) { 
     if (requestCode == SELECT_PICTURE) { 
      Utils.imgUri = data.getData(); 
      Utils.imgPath = getPath(Utils.imgUri); 
      File file = new File(Utils.imgPath); 
      boolean deleted = file.delete(); 
     } 
    } 
} 

donde getPath método es:

public String getPath(Uri uri) { 
    String[] projection = { MediaStore.Images.Media.DATA }; 
    Cursor cursor = managedQuery(uri, projection, null, null, null); 
    if(cursor!=null){ 
     int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
     cursor.moveToFirst(); 
     return cursor.getString(column_index); 
    } 
    else return null; 
} 

Las imágenes se eliminan correctamente, pero en la galería sigue siendo una vista previa de la imagen eliminada. Cuando toco sobre él, se carga una imagen en negro ...

entonces, ¿cómo puedo actualizar las vistas previas de la galería, después de eliminar algunas imágenes de mi código de aplicación?

Respuesta

4

resuelve añadiendo:

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.

same problem here

+0

No funciona. Deja la imagen en la galería. Instrucciones poco claras arriba, agregué su línea inmediatamente después de file.delete(); la función se llama. Si esto es correcto, el código no funciona como se esperaba. – Bisclavret

+0

Super ... funciona como un encanto ... + 1 voto –

0

¿Ha establecido el permiso <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> en el archivo de manifiesto?

0

¿Está seguro de que la ruta del archivo es correcta? Debido a que la forma en que lo hace, la eliminación real debería estar bien, consulte este hilo SO: How to delete a file from SD card?

¿Debería estar/mnt/realmente allí? Además, ¿tiene los permisos para eliminar archivos del almacenamiento? (android.permission.WRITE_EXTERNAL_STORAGE)

+0

Sí, tengo este permiso. ¿Qué quiere decir con "/ mnt/realmente estar allí?". Obtengo el camino de la imagen desde el Uri, con el método getPath(). – Matteo

+0

Parece que la ruta es incorrecta, ya que file.exists() también devuelve false. Aquí se usa otra forma (pero similar) de obtener la ruta: http://stackoverflow.com/questions/2507898/how-to-pick-a-image-from-gallery-sd-card-for-my-app- in -roid –

0

en el parámetro "datos" también tiene el Uri, simplemente haga "data.getUri()". Además, ¿estás probando en dispositivos reales? si es así y si es un Samsung, no es trabajo (vea esto thread).

+0

Obtengo el Uri con "data.getUri()", luego obtengo la ruta con el método "getPath()". ¿Hay alguna manera de eliminar un archivo usando su Uri? – Matteo

+0

si usar un objeto File con ese uri no funciona, entonces intente usar un contentResolver.delete (uri, null, null) – Finuka

36

¿por qué se hacen tan complejo?

usted puede hacerlo tan simple como esto:

getContentResolver().delete(Utils.imgUri, null, null); 
-2

añadir a continuación el código en OnDestroy

si (myFile.exists()) myFile.delete();

y no se olvide de añadir el permiso de Manifiesto archivo

android.permission.WRITE_EXTERNAL_STORAGE

0

sencilla una línea;)

new File(uri.getPath()).delete(); 

y en el manifiesto debe utilizar estos permisos

android.permission.WRITE_EXTERNAL_STORAGE

+0

No todos los uris son caminos. –

+0

Sí, eso es cierto, pero esto es así, en caso de que esté jugando con SDCard. –

Cuestiones relacionadas