2010-11-10 19 views
15

He añadido una galería inserta en el uso de la API de Android de la siguiente manera:¿Cómo puedo actualizar la Galería después de insertar una Imagen en Android?

Images.Media.insertImage (ctx.getContentResolver(), "SCard/test.jpg", "Hola", "Descripción ");

En realidad, la imagen que he pasado por su ruta completa (scard/test.jpg) ya está insertada correctamente en la base de datos, pero cuando la abres no puedes verla a menos que apagues/enciendas el dispositivo o Montar/Desmontar la memoria externa.

¿Hay alguna manera de actualizar la galería a pedido?

Gracias

Bassel Kh.

+0

su enfoque no funciona porque utiliza una ruta de archivo relativa "scard/test.jpg" en lugar de una ruta de archivo "/scard/test.jpg" absoluta. – k3b

Respuesta

18

La solución que utiliza el Escáner de Medios (sendBroadcast) es muy buena, y la estoy utilizando en mi aplicación.

Pero, probablemente, en las tarjetas SD con muchas fotos y datos, esta operación debería alcanzar un alto nivel de procesamiento.

Hay otra solución, después de guardar su archivo multimedia en la galería, debe avisar a la galería DB que se insertó otro archivo. Eso se puede hacer así:

private void addImageGallery(File file) { 
    ContentValues values = new ContentValues(); 
    values.put(MediaStore.Images.Media.DATA, file.getAbsolutePath()); 
    values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); // setar isso 
    getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 
} 

Este código no guarda el archivo multimedia a la galería, sólo guarda la información sobre un nuevo archivo en la galería DB. Deberías guardar el archivo real antes.

Esta solución es más rápida porque la galería no se volverá a escanear por completo. Pero no es tan confiable porque toda la información sobre el archivo se agregó manualmente.

+0

muy buena solución. está funcionando bien. +1 –

3
static public boolean resetExternalStorageMedia(Context context) { 
    if (Environment.isExternalStorageEmulated()) 
     return (false); 
    Uri uri = Uri.parse("file://" + Environment.getExternalStorageDirectory()); 
    Intent intent = new Intent(Intent.ACTION_MEDIA_MOUNTED, uri); 

    context.sendBroadcast(intent); 
    return (true); 
} 

static public void notifyMediaScannerService(Context context, String path) { 
    MediaScannerConnection.scanFile(context, 
      new String[] { path }, null, 
      new MediaScannerConnection.OnScanCompletedListener() { 
     public void onScanCompleted(String path, Uri uri) { 
      Log.i("ExternalStorage", "Scanned " + path + ":"); 
      Log.i("ExternalStorage", "-> uri=" + uri); 
     } 
    }); 
} 
21

me encontré con este problema hace poco, me trataron @ solución de Samuh, pero no funciona a la perfección hasta que encontré la solución de Google's example:

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

intenté yo mismo y funcionó a la perfección.

O, del mismo modo, es posible que desee echar un vistazo a la referencia de la MediaScanner Class y alguien en StackOverflow esta pregunta antes: Image, saved to sdcard, doesn't appear in Android's Gallery app

0

Puede utilizar esto para la actualización de Android Gallery:

public void refreshAndroidGallery(Uri fileUri) { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
      Intent mediaScanIntent = new Intent(
        Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 
      mediaScanIntent.setData(fileUri); 
      mContext.sendBroadcast(mediaScanIntent); 
     } else { 
      mContext.sendBroadcast(new Intent(
        Intent.ACTION_MEDIA_MOUNTED, 
        Uri.parse("file://" + Environment.getExternalStorageDirectory()))); 
     } 
    } 
Cuestiones relacionadas