belongs to Maven artifact com.android.support:support-compat:28.0.0-alpha1
FileProvider
  public
  
  
  
  class
  FileProvider
  
  
  
  
    extends ContentProvider
  
  
  
  
  
  
| java.lang.Object | ||
| ↳ | android.content.ContentProvider | |
| ↳ | android.support.v4.content.FileProvider | |
FileProvider is a special subclass of ContentProvider that facilitates secure sharing
 of files associated with an app by creating a content:// Uri for a file
 instead of a file:/// Uri.
 
 A content URI allows you to grant read and write access using
 temporary access permissions. When you create an Intent containing
 a content URI, in order to send the content URI
 to a client app, you can also call Intent.setFlags() to add
 permissions. These permissions are available to the client app for as long as the stack for
 a receiving Activity is active. For an Intent going to a
 Service, the permissions are available as long as the
 Service is running.
 
 In comparison, to control access to a file:/// Uri you have to modify the
 file system permissions of the underlying file. The permissions you provide become available to
 any app, and remain in effect until you change them. This level of access is
 fundamentally insecure.
 
The increased level of file access security offered by a content URI makes FileProvider a key part of Android's security infrastructure.
This overview of FileProvider includes the following topics:
- Defining a FileProvider
- Specifying Available Files
- Retrieving the Content URI for a File
- Granting Temporary Permissions to a URI
- Serving a Content URI to Another App
Defining a FileProvider
 Since the default functionality of FileProvider includes content URI generation for files, you
 don't need to define a subclass in code. Instead, you can include a FileProvider in your app
 by specifying it entirely in XML. To specify the FileProvider component itself, add a
 <provider>
 element to your app manifest. Set the android:name attribute to
 android.support.v4.content.FileProvider. Set the android:authorities
 attribute to a URI authority based on a domain you control; for example, if you control the
 domain mydomain.com you should use the authority
 com.mydomain.fileprovider. Set the android:exported attribute to
 false; the FileProvider does not need to be public. Set the
 android:grantUriPermissions attribute to true, to allow you
 to grant temporary access to files. For example:
 
<manifest> ... <application> ... <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.mydomain.fileprovider" android:exported="false" android:grantUriPermissions="true"> ... </provider> ... </application> </manifest>
 If you want to override any of the default behavior of FileProvider methods, extend
 the FileProvider class and use the fully-qualified class name in the android:name
 attribute of the <provider> element.
 
Specifying Available Files
A FileProvider can only generate a content URI for files in directories that you specify beforehand. To specify a directory, specify its storage area and path in XML, using child elements of the<paths> element.
 For example, the following paths element tells FileProvider that you intend to
 request content URIs for the images/ subdirectory of your private file area.
 <paths xmlns:android="http://schemas.android.com/apk/res/android">
    <files-path name="my_images" path="images/"/>
    ...
</paths>
 The <paths> element must contain one or more of the following child elements:
 
- 
 <files-path name="name" path="path" /> 
- 
     Represents files in the files/subdirectory of your app's internal storage area. This subdirectory is the same as the value returned byContext.getFilesDir().
- 
 <cache-path name="name" path="path" /> 
- 
     Represents files in the cache subdirectory of your app's internal storage area. The root path
     of this subdirectory is the same as the value returned by getCacheDir().
- 
 <external-path name="name" path="path" /> 
- 
     Represents files in the root of the external storage area. The root path of this subdirectory
     is the same as the value returned by
     Environment.getExternalStorageDirectory().
- 
 <external-files-path name="name" path="path" /> 
- 
     Represents files in the root of your app's external storage area. The root path of this
     subdirectory is the same as the value returned by
     Context#getExternalFilesDir(String) Context.getExternalFilesDir(null).
- 
 <external-cache-path name="name" path="path" /> 
- 
     Represents files in the root of your app's external cache area. The root path of this
     subdirectory is the same as the value returned by
     Context.getExternalCacheDir().
- 
 <external-media-path name="name" path="path" /> 
- 
     Represents files in the root of your app's external media area. The root path of this
     subdirectory is the same as the value returned by the first result of
     Context.getExternalMediaDirs().Note: this directory is only available on API 21+ devices. 
These child elements all use the same attributes:
- 
         name="name"
- 
         A URI path segment. To enforce security, this value hides the name of the subdirectory
         you're sharing. The subdirectory name for this value is contained in the
         pathattribute.
- 
         path="path"
- 
         The subdirectory you're sharing. While the nameattribute is a URI path segment, thepathvalue is an actual subdirectory name. Notice that the value refers to a subdirectory, not an individual file or files. You can't share a single file by its file name, nor can you specify a subset of files using wildcards.
 You must specify a child element of <paths> for each directory that contains
 files for which you want content URIs. For example, these XML elements specify two directories:
 
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <files-path name="my_images" path="images/"/>
    <files-path name="my_docs" path="docs/"/>
</paths>
 Put the <paths> element and its children in an XML file in your project.
 For example, you can add them to a new file called res/xml/file_paths.xml.
 To link this file to the FileProvider, add a
 <meta-data> element
 as a child of the <provider> element that defines the FileProvider. Set the
 <meta-data> element's "android:name" attribute to
 android.support.FILE_PROVIDER_PATHS. Set the element's "android:resource" attribute
 to @xml/file_paths (notice that you don't specify the .xml
 extension). For example:
 
<provider android:name="android.support.v4.content.FileProvider" android:authorities="com.mydomain.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider>
Generating the Content URI for a File
 To share a file with another app using a content URI, your app has to generate the content URI.
 To generate the content URI, create a new File for the file, then pass the File
 to getUriForFile(). You can send the content URI
 returned by getUriForFile() to another app in an
 Intent. The client app that receives the content URI can open the file
 and access its contents by calling
 ContentResolver.openFileDescriptor to get a ParcelFileDescriptor.
 
 For example, suppose your app is offering files to other apps with a FileProvider that has the
 authority com.mydomain.fileprovider. To get a content URI for the file
 default_image.jpg in the images/ subdirectory of your internal storage
 add the following code:
 
File imagePath = new File(Context.getFilesDir(), "images"); File newFile = new File(imagePath, "default_image.jpg"); Uri contentUri = getUriForFile(getContext(), "com.mydomain.fileprovider", newFile);
getUriForFile() returns the content URI
 content://com.mydomain.fileprovider/my_images/default_image.jpg.
 Granting Temporary Permissions to a URI
To grant an access permission to a content URI returned fromgetUriForFile(), do one of the following:
 - 
     Call the method
     Context.grantUriPermission(package, Uri, mode_flags)for thecontent://Uri, using the desired mode flags. This grants temporary access permission for the content URI to the specified package, according to the value of the themode_flagsparameter, which you can set toFLAG_GRANT_READ_URI_PERMISSION,FLAG_GRANT_WRITE_URI_PERMISSIONor both. The permission remains in effect until you revoke it by callingrevokeUriPermission()or until the device reboots.
- 
     Put the content URI in an Intentby callingsetData().
- 
     Next, call the method Intent.setFlags()with eitherFLAG_GRANT_READ_URI_PERMISSIONorFLAG_GRANT_WRITE_URI_PERMISSIONor both.
- 
     Finally, send the Intentto another app. Most often, you do this by callingsetResult().Permissions granted in an Intentremain in effect while the stack of the receivingActivityis active. When the stack finishes, the permissions are automatically removed. Permissions granted to oneActivityin a client app are automatically extended to other components of that app.
Serving a Content URI to Another App
 There are a variety of ways to serve the content URI for a file to a client app. One common way
 is for the client app to start your app by calling
 startActivityResult(),
 which sends an Intent to your app to start an Activity in your app.
 In response, your app can immediately return a content URI to the client app or present a user
 interface that allows the user to pick a file. In the latter case, once the user picks the file
 your app can return its content URI. In both cases, your app returns the content URI in an
 Intent sent via setResult().
 
  You can also put the content URI in a ClipData object and then add the
  object to an Intent you send to a client app. To do this, call
  Intent.setClipData(). When you use this approach, you can
  add multiple ClipData objects to the Intent, each with its own
  content URI. When you call Intent.setFlags() on the Intent
  to set temporary access permissions, the same permissions are applied to all of the content
  URIs.
 
  Note: The Intent.setClipData() method is
  only available in platform version 16 (Android 4.1) and later. If you want to maintain
  compatibility with previous versions, you should send one content URI at a time in the
  Intent. Set the action to ACTION_SEND and put the URI in data by calling
  setData().
 
More Information
To learn more about FileProvider, see the Android training class Sharing Files Securely with URIs.
Summary
| Inherited constants | 
|---|
| 
    android.content.ComponentCallbacks2
   | 
| Public constructors | |
|---|---|
| 
      FileProvider()
       | |
| Public methods | |
|---|---|
| 
        
        
        
        
        
        void | 
      attachInfo(Context context, ProviderInfo info)
      After the FileProvider is instantiated, this method is called to provide the system with information about the provider. | 
| 
        
        
        
        
        
        int | 
      delete(Uri uri, String selection, String[] selectionArgs)
      Deletes the file associated with the specified content URI, as
 returned by  | 
| 
        
        
        
        
        
        String | 
      getType(Uri uri)
      Returns the MIME type of a content URI returned by
  | 
| 
        
        
        static
        
        
        Uri | 
      getUriForFile(Context context, String authority, File file)
      Return a content URI for a given  | 
| 
        
        
        
        
        
        Uri | 
      insert(Uri uri, ContentValues values)
      By default, this method throws an  | 
| 
        
        
        
        
        
        boolean | 
      onCreate()
      The default FileProvider implementation does not need to be initialized. | 
| 
        
        
        
        
        
        ParcelFileDescriptor | 
      openFile(Uri uri, String mode)
      By default, FileProvider automatically returns the
  | 
| 
        
        
        
        
        
        Cursor | 
      query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
      Use a content URI returned by
  | 
| 
        
        
        
        
        
        int | 
      update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
      By default, this method throws an  | 
| Inherited methods | |
|---|---|
| 
  
    android.content.ContentProvider
  
 | |
| 
  
    java.lang.Object
  
 | |
| 
  
    android.content.ComponentCallbacks2
  
 | |
| 
  
    android.content.ComponentCallbacks
  
 | |
Public constructors
Public methods
attachInfo
void attachInfo (Context context, ProviderInfo info)
After the FileProvider is instantiated, this method is called to provide the system with information about the provider.
| Parameters | |
|---|---|
| context | Context: AContextfor the current component. | 
| info | ProviderInfo: AProviderInfofor the new provider. | 
delete
int delete (Uri uri, String selection, String[] selectionArgs)
Deletes the file associated with the specified content URI, as
 returned by getUriForFile(). Notice that this
 method does not throw an IOException; you must check its return value.
| Parameters | |
|---|---|
| uri | Uri: A content URI for a file, as returned bygetUriForFile(). | 
| selection | String: Ignored. Set tonull. | 
| selectionArgs | String: Ignored. Set tonull. | 
| Returns | |
|---|---|
| int | 1 if the delete succeeds; otherwise, 0. | 
getType
String getType (Uri uri)
Returns the MIME type of a content URI returned by
 getUriForFile().
| Parameters | |
|---|---|
| uri | Uri: A content URI returned bygetUriForFile(). | 
| Returns | |
|---|---|
| String | If the associated file has an extension, the MIME type associated with that
 extension; otherwise application/octet-stream. | 
getUriForFile
Uri getUriForFile (Context context, String authority, File file)
Return a content URI for a given File. Specific temporary
 permissions for the content URI can be set with
 grantUriPermission(String, Uri, int), or added
 to an Intent by calling setData() and then
 setFlags(); in both cases, the applicable flags are
 FLAG_GRANT_READ_URI_PERMISSION and
 FLAG_GRANT_WRITE_URI_PERMISSION. A FileProvider can only return a
 content Uri for file paths defined in their <paths>
 meta-data element. See the Class Overview for more information.
| Parameters | |
|---|---|
| context | Context: AContextfor the current component. | 
| authority | String: The authority of aFileProviderdefined in a<provider>element in your app's manifest. | 
| file | File: AFilepointing to the filename for which you want acontentUri. | 
| Returns | |
|---|---|
| Uri | A content URI for the file. | 
| Throws | |
|---|---|
| IllegalArgumentException | When the given Fileis outside
 the paths supported by the provider. | 
insert
Uri insert (Uri uri, ContentValues values)
By default, this method throws an UnsupportedOperationException. You must
 subclass FileProvider if you want to provide different functionality.
| Parameters | |
|---|---|
| uri | Uri | 
| values | ContentValues | 
| Returns | |
|---|---|
| Uri | |
onCreate
boolean onCreate ()
The default FileProvider implementation does not need to be initialized. If you want to override this method, you must provide your own subclass of FileProvider.
| Returns | |
|---|---|
| boolean | |
openFile
ParcelFileDescriptor openFile (Uri uri, String mode)
By default, FileProvider automatically returns the
 ParcelFileDescriptor for a file associated with a content://
 Uri. To get the ParcelFileDescriptor, call
 ContentResolver.openFileDescriptor.
 To override this method, you must provide your own subclass of FileProvider.
| Parameters | |
|---|---|
| uri | Uri: A content URI associated with a file, as returned bygetUriForFile(). | 
| mode | String: Access mode for the file. May be "r" for read-only access, "rw" for read and
 write access, or "rwt" for read and write access that truncates any existing file. | 
| Returns | |
|---|---|
| ParcelFileDescriptor | A new ParcelFileDescriptorwith which you can access the file. | 
| Throws | |
|---|---|
| FileNotFoundException | |
query
Cursor query (Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
Use a content URI returned by
 getUriForFile() to get information about a file
 managed by the FileProvider.
 FileProvider reports the column names defined in OpenableColumns:
 
ContentProvider.query().
    | Parameters | |
|---|---|
| uri | Uri: A content URI returned bygetUriForFile(Context, String, File). | 
| projection | String: The list of columns to put into theCursor. If null all columns are
 included. | 
| selection | String: Selection criteria to apply. If null then all data that matches the content
 URI is returned. | 
| selectionArgs | String: An array ofString, containing arguments to bind to
 the selection parameter. The query method scans selection from left to
 right and iterates through selectionArgs, replacing the current "?" character in
 selection with the value at the current position in selectionArgs. The
 values are bound to selection asStringvalues. | 
| sortOrder | String: AStringcontaining the column name(s) on which to sort
 the resultingCursor. | 
| Returns | |
|---|---|
| Cursor | A Cursorcontaining the results of the query. | 
update
int update (Uri uri, ContentValues values, String selection, String[] selectionArgs)
By default, this method throws an UnsupportedOperationException. You must
 subclass FileProvider if you want to provide different functionality.
| Parameters | |
|---|---|
| uri | Uri | 
| values | ContentValues | 
| selection | String | 
| selectionArgs | String | 
| Returns | |
|---|---|
| int | |
- Interfaces
- Classes
