Android: Actualizar la Galería después de guardar nuevas imágenes

Así que en mi aplicación en un momento guardar un montón de imágenes a una carpeta temporal, y quiero que aparezcan inmediatamente en la Galería. Fuera de un reinicio, lo hacen, pero de lo contrario no lo hacen.

He intentado usar el método sendBroadcast:

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

Pero obtengo un error de permiso:

 E/AndroidRuntime( 2628): java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.MEDIA_MOUNTED from pid=2628, uid=10068 

¿Podría faltar un permiso en mi AndroidManifest, o esto ya no es compatible? Gracias

Pruebe esto, funciona para mí en Kitkat (4.4) https://stackoverflow.com/a/5814533/640528

  MediaScannerConnection.scanFile(this, new String[] { Environment.getExternalStorageDirectory().toString() }, null, new MediaScannerConnection.OnScanCompletedListener() { /* * (non-Javadoc) * @see android.media.MediaScannerConnection.OnScanCompletedListener#onScanCompleted(java.lang.String, android.net.Uri) */ public void onScanCompleted(String path, Uri uri) { Log.i("ExternalStorage", "Scanned " + path + ":"); Log.i("ExternalStorage", "-> uri=" + uri); } }); 

Intenté Environment.getExternalStorageDirectory().toString() , pero no encontró mi carpeta personalizada.

Sólo quería compartir mi experiencia para resolver este problema.

Al final, tenía MediaScannerConnection configurado para escanear un archivo a la vez y ahora falta la carpeta que estaba sosteniendo esas imágenes apareció. Cada vez que descargo cada imagen, llamé a MediaScannerConnection y la ruta del archivo como Uri en lugar de la propia carpeta.

Además, mucha gente preguntó por qué sendBroadcast dejar de trabajar en kitkat y la respuesta es que sendBroadcast fue abusado y llamado demasiadas veces y causando el sistema de drenaje de la batería o la desaceleración, por lo que eliminó la llamada directa para evitar el abuso que tiene sentido. Tenía la esperanza de utilizar la solución anterior a la carpeta que contienen todas las imágenes, pero no funcionó en la carpeta. Esperaba que la carpeta de búsqueda que exponen resto de los archivos dentro de la carpeta personalizada, pero no en mi caso. Espero encontrar una mejor respuesta en el futuro …

He aquí un fragmento de mi código.

 MediaScannerConnection.scanFile(ApplicationContext.context, new String[] { imageFile.getPath() }, null, new MediaScannerConnection.OnScanCompletedListener() { @Override public void onScanCompleted(String path, Uri uri) { Log.i(TAG, "Scanned " + path); } }); 

Intente esto: después de guardar su archivo en la carpeta, escriba debajo del código

 sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File("your image path")))); 

Implementar MediaScannerConnectionClient y agregar el siguiente code.Works perfectamente en 4.4 🙂

 MediaScannerConnection conn; public void startScan(String url) { imagepath = url; if (conn != null) conn.disconnect(); conn = new MediaScannerConnection(activity.this, activity.this); conn.connect(); } @Override public void onMediaScannerConnected() { try { conn.scanFile(imagepath, getMimeType(imagepath)); } catch (java.lang.IllegalStateException e) { //Do something } } @Override public void onScanCompleted(String path, Uri uri) { conn.disconnect(); } 

Sé que es tarde, pero probar esto puede trabajar en todas las versiones:

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { Intent mediaScanIntent = new Intent( Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); Uri contentUri = Uri.fromFile(out); //out is your file you saved/deleted/moved/copied mediaScanIntent.setData(contentUri); this.sendBroadcast(mediaScanIntent); } else { sendBroadcast(new Intent( Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory()))); } 

Utilice MediaScannerConnection en lugar de SendBroadcast ..

 MediaScannerConnection.MediaScannerConnectionClient( { @Override public void onScanCompleted(String path, Uri uri) { if (path.equals(**your filename**.getAbsolutePath())) { Log.i("Scan Status", "Completed"); Log.i("uri: ",uri.toString()); conn.disconnect(); } } @Override public void onMediaScannerConnected() { // TODO Auto-generated method stub conn.scanFile(**your file name**.getAbsolutePath(),null); } }); conn.connect(); 

Debajo del código trabajo todo el dispositivo para refrescar la galería después de guardar la imagen.

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); File f1 = new File("file://" + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)); Uri contentUri = Uri.fromFile(f1); mediaScanIntent.setData(contentUri); sendBroadcast(mediaScanIntent); } else { sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory()))); } sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File("your image path")))); 
  • Inserción de un vídeo en MediaStore
  • ¿Por qué MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI no proporciona un "Artista de Álbum" preciso?
  • Mediastore para Android: ¿Cómo recuperar de forma eficiente todas las canciones de un determinado género?
  • ¿Cómo consultar canciones en listas de reproducción en Android SDK?
  • Cómo guardar la ruta de la imagen utilizando las preferencias compartidas
  • No puede solicitar permiso READ_EXTERNAL_STORAGE
  • Cómo obtener datos de MediaStore.File y MediaStore.File.FileColumn
  • Cuando toma la foto get - java.lang.Throwable: file: // Uri expuesto a través de ClipData.Item.getUri ()
  • Por qué Images.Media.insertImage devuelve null
  • Filtra un managedQuery por extensión de archivo (o, alternativamente, tipo de archivo) para un Cursor de Android
  • NullPointerException en android AsyncTask en el método innerSetException ():
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.