1

I've written an Android app that is a simpler version of the stock camera. It only records video.

Despite this being a custom app, I'd like to have the videos recorded by this be easily visible from the Photos and Gallery apps.

I was under the impression that this is what the "MediaScannerConnection" class is for. I've found common advice that shows how to use this in either a "sendBroadcast" mode, or a more manual "scanFile" approach. I've implemented both of these options and found that they appear to have no effect. When I stop the recorder, a valid video is stored (I can play it from a file browser afterwards), but neither Photos or Gallery is made aware of the new video.

I've been storing the videos in files like "/storage/emulated/0/DCIM/Camera/20151223_150115.mp4". That directory also contains videos taken by the stock camera app. The base path was obtained from "Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)". I originally tried replacing "Camera" with a directory name based on the name of my app, but as that wasn't working (Photos/Gallery not seeing it, despite it being stored properly), I decided to try storing them where the stock videos are stored. That isn't working either.

My test device is a Galaxy Note 3, running Android 5.0.

My first attempt at using MediaScannerConnection was with this:

sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + outputFilePath)));

One of the values of "outputFilePath" is exactly the path shown above.

As this didn't appear to do anything, I then later tried this:

new SingleMediaScanner(getApplicationContext(), new File(outputFilePath));

Where "SingleMediaScanner" is this:

public static class SingleMediaScanner implements MediaScannerConnection.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(), "image/*");
    }

    @Override
    public void onScanCompleted(String path, Uri uri) {
        mMs.disconnect();
    }
}

I tried running the last implementation in the debugger, and I saw it get to "onScanCompleted", but neither of the aforementioned apps see the new video.

Update:

With the current implementation, the "onScanCompleted" callback method gets called with "path" and "uri" parameters, which have the following values:

path:                         /storage/emulated/0/DCIM/Camera/20151223_194434.mp4
uri.toString():               content://media/external/file/106639
Uri.fromFile(new File(Path)): file:///storage/emulated/0/DCIM/Camera/20151223_194434.mp4
David M. Karr
  • 14,317
  • 20
  • 94
  • 199
  • have a look here : http://stackoverflow.com/a/19794372/2745762 – Nishant Srivastava Dec 23 '15 at 23:18
  • Thanks, but that's just rehashing all of the same advice I've already seen. Nevertheless, I did try the other variation described there, using the other "scanFile" variation, and that did the same as the other two variations, effectively nothing. – David M. Karr Dec 23 '15 at 23:44
  • Did you compare the output of `Uri.fromFile(File f)` with your built string? Just to make sure, a wrong Uri is not the issue... – Desdroid Dec 24 '15 at 00:53
  • Ok, I'll update the post with info about this. – David M. Karr Dec 24 '15 at 03:32

0 Answers0