Accessing Pictures using FileProvider

Posted on April 13, 2017 in Development

Accessing Pictures using FileProvider

FileProvider is the backbone which helps in secure sharing of files across file-system on Android device.

I’m using example of taking picture using camera on Android device to understand how FileProvider works. This Project demos does two things:
1. Takes Picture: FAB to take picture
2. Displays picture taken: Displaying recent picture

Scenario

User Clicks FAB to take picture. Picture got displayed in ImageView. we want to know what went behind the scenes from clicking the FAB to displaying a picture. How/where the image file got created ? What made it available to Camera Intent ? Yes, you guessed it ! FileProvider made newly created blank image file available to Camera Intent to store pixels/binary data of new pictures in it.

Internals

What happens when user clicks on FAB to initiate taking picture ? First of all a temporary file get created under picture directory for app. The storage location will be something like this: /storage/emulated/0/Android/data/org.pcc.fileprovider/files/Pictures

This file is queried using FileProvider and passed to the camera intent.

Code to query recently created image file in internal picture directory for app:

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Uri imgUri = FileProvider.getUriForFile(this,
                    "org.pcc.fileprovider", imageFile.getFile());
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, imgUri);
startActivityForResult(takePictureIntent, REQUEST_CODE_IMAGE_CAPTURE);

Configuring FileProvider in Android Studio Project

It's a two step process. First you've to declare <provider> tag in your app's AndroidManifest.xml. Second, you will need to create file_paths.xml inside res/xml folder.

AndroidManifest.xml

<provider> tag has to be declared inside <application> tag.

<application
        ...>
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="org.pcc.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>
       ....
</application>        
file_paths.xml

Create a file file_paths.xml inside res/xml folder of your app. This file will have these contents in it:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="my_images" path="Android/data/org.pcc.fileprovider/files/Pictures" />
</paths>

That's it !

Checkout source code in github to see FileProviderDemo in action.