Android Cómo usar MediaScannerConnection scanFile

Estoy agregando imágenes a una carpeta en el SDCARD. Como las imágenes y mi carpeta no se pueden ver inmediatamente en la Galería, trato de que la MediaScannerConnection se actualice y muestre la carpeta / imágenes en la galería. Esto no funciona tan bien para mí, ya que no aparece nada en la Galería. Solo estoy probando en Eclipse AVD.

No veo mucho hablar sobre esto, tal vez porque ScanFile es nuevo desde api8. ¿Podría alguien mostrar cómo se hace esto?

Estoy intentándolo tanto en un servicio como en una Actividad pero sigo obteniendo uri = nulo cuando está en OnScanCompleted.

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

Me di cuenta de que quizás estabas buscando una solución para lo que funcionaría antes del nivel 8 de la API, y no podía entender la respuesta de Mitch. Lo resolví creando una clase para escanear un solo archivo:

 import java.io.File; import android.content.Context; import android.media.MediaScannerConnection; import android.media.MediaScannerConnection.MediaScannerConnectionClient; import android.net.Uri; public class SingleMediaScanner implements MediaScannerConnectionClient { private MediaScannerConnection mMs; private File mFile; public SingleMediaScanner(Context context, File f) { mFile = f; mMs = new MediaScannerConnection(context, this); mMs.connect(); } @Override public void onMediaScannerConnected() { mMs.scanFile(mFile.getAbsolutePath(), null); } @Override public void onScanCompleted(String path, Uri uri) { mMs.disconnect(); } } 

y lo usaría así para hacer que MediaScannerConnection escanee un solo archivo:

 new SingleMediaScanner(this, file); 

Espero que esto ayude.

Estaba buscando lo mismo y encontré esto en ApiDemos, ExternalStorage. Resolvió todos mis problemas mientras escanea un solo archivo.

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

O puede usar el siguiente método:

 private void scanFile(String path) { MediaScannerConnection.scanFile(MainActivity.this, new String[] { path }, null, new MediaScannerConnection.OnScanCompletedListener() { public void onScanCompleted(String path, Uri uri) { Log.i("TAG", "Finished scanning " + path); } }); } 

Escaneo de archivo de llamada como:

 scanFile(yourFile.getAbsolutePath()); 

No envíe sendBroadcast si solo desea que aparezca una imagen en la galería. Eso sería una gran pérdida de recursos. Tendrá que hacer un MediaScannerConnectionClient y luego llamar a connect () en la MediaScannerConnection que hace desde allí para escanear el archivo. Aquí hay un ejemplo:

 private MediaScannerConnectionClient mediaScannerConnectionClient = new MediaScannerConnectionClient() { @Override public void onMediaScannerConnected() { mediaScannerConnection.scanFile("pathToImage/someImage.jpg", null); } @Override public void onScanCompleted(String path, Uri uri) { if(path.equals("pathToImage/someImage.jpg")) mediaScannerConnection.disconnect(); } }; new MediaScannerConnection(context, mediaScannerConnectionClient).connect(); 

Deje que su actividad implemente ‘MediaScannerConnectionClient’ y agregue esto a su actividad:

 private void startScan() { if(conn!=null) conn.disconnect(); conn = new MediaScannerConnection(YourActivity.this,YourActivity.this); conn.connect(); } @Override public void onMediaScannerConnected() { try{ conn.scanFile(yourImagePath, "image/*"); } catch (java.lang.IllegalStateException e){ } } @Override public void onScanCompleted(String path, Uri uri) { conn.disconnect(); } 

Escribí una respuesta detallada aquí, Trigger mediascanner en una ruta específica (carpeta), ¿cómo?

Espero que resuelva tu problema perfectamente.

 File file = new File(absolutePath); Uri uri = Uri.fromFile(file); Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri); sendBroadcast(intent); 

Use Intent lugar de MediaScannerConnection . MediaScannerConnection hará que su aplicación gc error con IMediaScannerListener.Stub mListener .

 Intent mediaScannerIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); Uri fileContentUri = Uri.parseFile(permFile); // With 'permFile' being the File object mediaScannerIntent.setData(fileContentUri); sendBroadcast(mediaScannerIntent);