Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

Im adding images to a folder on the SDCARD. Since the images and my folder is not immediately visible in the Gallery im trying to get the MediaScannerConnection to update and show the folder/images in the gallery. This is not working so good for me since nothing shows up in Gallery. Im only testing in Eclipse AVD.

I dont see much talk about this maybe because the scanFile is new since api8. Could someone show how this is done?

Im trying it in both a service and Activity but keep getting uri=null when onScanCompleted.

I realized that perhaps you were looking for a solution what would work previous to api level 8, and I could not make sense of Mitch's answer. I solved it by building a class for scanning a single file:

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

and you would use it like this to make the MediaScannerConnection scan a single file:

new SingleMediaScanner(this, file);
                @Petrus this works fine. Thanks. But I got an issue. In my application I capture series of images. But finally show only the second image after the scan completed. Can you please tell me what could be the problem.
– AnujAroshA
                Feb 27, 2012 at 4:54
                May I know why we need to initialize a new MediaScannerConnection, connect it, do the scanFile and then disconnect it everytime? I tried directly using the static method call MediaScannerConnection.scanFile and it works without doing all these.. Update: OK I've asked too early, so the static method only available for API > 8 , thanks!
– Bruce
                Jul 4, 2014 at 4:01

I was looking for the same thing and I found this in the ApiDemos, ExternalStorage. Solved all my problems as it scans a single file.

 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);
                this works like a charm, does this work for KitKat and above? I don't have a Kitkat device so I couldn't test it myself.
– Bruce
                Jul 4, 2014 at 4:03
                Uri is not null and showing path but image won't appear in gallery on emulator in Android 7.1 API 25
– dakshbhatt21
                Jul 18, 2017 at 8:02
                not working really      Uri.parse("/mnt/sdcard/PTPPservice/IMAG1175.jpg") Or is it a waiting time if scanner is busy?
– Erik
                Jan 10, 2011 at 14:08
                I got it working now, wanted to update and show one picture only not the hole SD Card. Thinking it would take long time to re-mount the SD if there is much on it.  Is there a way to only update a single item?
– Erik
                Jan 10, 2011 at 20:09
                Actually with Android 4.4 you will even get a java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.MEDIA_MOUNTED for trying this. Using MediaScannerConnection.scanFile is the right way to go. See example in one of the other answers .
– Holger
                Dec 2, 2014 at 7:24
                Do not do this anymore for: 1. Not working on almost every current devices. 2. Api < 8 no need to be supported now. 3. Huge waste for only coding-time convenience.
– Meow Cat 2012
                Mar 4, 2019 at 12:33
        MediaScannerConnection.scanFile(MainActivity.this,
                new String[] { path }, null,
                new MediaScannerConnection.OnScanCompletedListener() {
                    public void onScanCompleted(String path, Uri uri) {
                        Log.i("TAG", "Finished scanning " + path);

Call file scan as:

scanFile(yourFile.getAbsolutePath());
                not working in 4.4.4.. even not getting any error..! is there any permission req. in manifest ?
– Mayur R. Amipara
                Apr 10, 2015 at 7:24
                Currently using 4.4.2 and it does not work (single file, simple situation). Anybody knows why the behavior of this method is so unstable it seems to work only in half of the cases?
– JM Lord
                Apr 1, 2016 at 18:59
                Uri is not null and showing path but image won't appear in gallery on emulator in Android 7.1
– dakshbhatt21
                Jul 18, 2017 at 8:02

Do not do the sendBroadcast if you only want one image to appear in the gallery. That'd be a huge waste of resources. You'll need to make a MediaScannerConnectionClient and then call connect() on the MediaScannerConnection you make from it to scan the file. Here's an example:

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();
    if(conn!=null) conn.disconnect();  
    conn = new MediaScannerConnection(YourActivity.this,YourActivity.this); 
    conn.connect(); 
@Override 
public void onMediaScannerConnected() { 
        conn.scanFile(yourImagePath, "image/*");
       } catch (java.lang.IllegalStateException e){
@Override 
public void onScanCompleted(String path, Uri uri) { 
    conn.disconnect(); 
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 instead of MediaScannerConnection. MediaScannerConnection will make your app gc error with 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);
        

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.