public abstract class DocumentFile extends Object
DocumentsProvider
or a raw file on disk. This is a
utility class designed to emulate the traditional File
interface. It
offers a simplified view of a tree of documents, but it has substantial
overhead. For optimal performance and a richer feature set, use the
DocumentsContract
methods and constants directly.
There are several differences between documents and traditional files:
Before using this class, first consider if you really need access to an
entire subtree of documents. The principle of least privilege dictates that
you should only ask for access to documents you really need. If you only need
the user to pick a single file, use Intent.ACTION_OPEN_DOCUMENT
or
Intent.ACTION_GET_CONTENT
. If you want to let the user pick multiple
files, add Intent.EXTRA_ALLOW_MULTIPLE
. If you only need the user to
save a single file, use Intent.ACTION_CREATE_DOCUMENT
. If you use
these APIs, you can pass the resulting Intent.getData()
into
fromSingleUri(Context, Uri)
to work with that document.
If you really do need full access to an entire subtree of documents, start by
launching Intent.ACTION_OPEN_DOCUMENT_TREE
to let the user pick a
directory. Then pass the resulting Intent.getData()
into
fromTreeUri(Context, Uri)
to start working with the user selected
tree.
As you navigate the tree of DocumentFile instances, you can always use
getUri()
to obtain the Uri representing the underlying document for
that object, for use with ContentResolver.openInputStream(Uri)
, etc.
To simplify your code on devices running
Build.VERSION_CODES.KITKAT
or earlier, you can use
fromFile(File)
which emulates the behavior of a
DocumentsProvider
.
DocumentsProvider
,
DocumentsContract
Modifier and Type | Method and Description |
---|---|
abstract boolean |
canRead()
Indicates whether the current context is allowed to read from this file.
|
abstract boolean |
canWrite()
Indicates whether the current context is allowed to write to this file.
|
abstract DocumentFile |
createDirectory(String displayName)
Create a new directory as a direct child of this directory.
|
abstract DocumentFile |
createFile(String mimeType,
String displayName)
Create a new document as a direct child of this directory.
|
abstract boolean |
delete()
Deletes this file.
|
abstract boolean |
exists()
Returns a boolean indicating whether this file can be found.
|
DocumentFile |
findFile(String displayName)
Search through
listFiles() for the first document matching the
given display name. |
static DocumentFile |
fromFile(File file)
Create a
DocumentFile representing the filesystem tree rooted at
the given File . |
static DocumentFile |
fromSingleUri(Context context,
Uri singleUri)
Create a
DocumentFile representing the single document at the
given Uri . |
static DocumentFile |
fromTreeUri(Context context,
Uri treeUri)
Create a
DocumentFile representing the document tree rooted at
the given Uri . |
abstract String |
getName()
Return the display name of this document.
|
DocumentFile |
getParentFile()
Return the parent file of this document.
|
abstract String |
getType()
Return the MIME type of this document.
|
abstract Uri |
getUri()
Return a Uri for the underlying document represented by this file.
|
abstract boolean |
isDirectory()
Indicates if this file represents a directory.
|
static boolean |
isDocumentUri(Context context,
Uri uri)
Test if given Uri is backed by a
DocumentsProvider . |
abstract boolean |
isFile()
Indicates if this file represents a file.
|
abstract long |
lastModified()
Returns the time when this file was last modified, measured in
milliseconds since January 1st, 1970, midnight.
|
abstract long |
length()
Returns the length of this file in bytes.
|
abstract DocumentFile[] |
listFiles()
Returns an array of files contained in the directory represented by this
file.
|
abstract boolean |
renameTo(String displayName)
Renames this file to
displayName . |
public static DocumentFile fromFile(File file)
DocumentFile
representing the filesystem tree rooted at
the given File
. This doesn't give you any additional access to the
underlying files beyond what your app already has.
getUri()
will return file://
Uris for files explored
through this tree.
public static DocumentFile fromSingleUri(Context context, Uri singleUri)
DocumentFile
representing the single document at the
given Uri
. This is only useful on devices running
Build.VERSION_CODES.KITKAT
or later, and will return
null
when called on earlier platform versions.singleUri
- the Intent.getData()
from a successful
Intent.ACTION_OPEN_DOCUMENT
or
Intent.ACTION_CREATE_DOCUMENT
request.public static DocumentFile fromTreeUri(Context context, Uri treeUri)
DocumentFile
representing the document tree rooted at
the given Uri
. This is only useful on devices running
Build.VERSION_CODES.LOLLIPOP
or later, and will return
null
when called on earlier platform versions.treeUri
- the Intent.getData()
from a successful
Intent.ACTION_OPEN_DOCUMENT_TREE
request.public static boolean isDocumentUri(Context context, Uri uri)
DocumentsProvider
.public abstract DocumentFile createFile(String mimeType, String displayName)
mimeType
- MIME type of new document, such as image/png
or
audio/flac
displayName
- name of new document, without any file extension
appended; the underlying provider may choose to append the
extensionUnsupportedOperationException
- when working with a single document
created from fromSingleUri(Context, Uri)
.DocumentsContract.createDocument(ContentResolver,
Uri, String, String)
public abstract DocumentFile createDirectory(String displayName)
displayName
- name of new directoryUnsupportedOperationException
- when working with a single document
created from fromSingleUri(Context, Uri)
.DocumentsContract.createDocument(ContentResolver,
Uri, String, String)
public abstract Uri getUri()
isDocumentUri(Context, Uri)
to
test if the returned Uri is backed by a
DocumentsProvider
.public abstract String getName()
public abstract String getType()
public DocumentFile getParentFile()
The underlying DocumentsProvider
only defines a
forward mapping from parent to child, so the reverse mapping of child to
parent offered here is purely a convenience method, and it may be
incorrect if the underlying tree structure changes.
public abstract boolean isDirectory()
true
if this file is a directory, false
otherwise.DocumentsContract.Document.MIME_TYPE_DIR
public abstract boolean isFile()
true
if this file is a file, false
otherwise.DocumentsContract.Document.COLUMN_MIME_TYPE
public abstract long lastModified()
DocumentsContract.Document.COLUMN_LAST_MODIFIED
public abstract long length()
DocumentsContract.Document.COLUMN_SIZE
public abstract boolean canRead()
true
if this file can be read, false
otherwise.public abstract boolean canWrite()
true
if this file can be written, false
otherwise.DocumentsContract.Document.COLUMN_FLAGS
,
DocumentsContract.Document.FLAG_SUPPORTS_DELETE
,
DocumentsContract.Document.FLAG_SUPPORTS_WRITE
,
DocumentsContract.Document.FLAG_DIR_SUPPORTS_CREATE
public abstract boolean delete()
Note that this method does not throw IOException
on
failure. Callers must check the return value.
true
if this file was deleted, false
otherwise.DocumentsContract.deleteDocument(ContentResolver,
Uri)
public abstract boolean exists()
true
if this file exists, false
otherwise.public abstract DocumentFile[] listFiles()
null
.UnsupportedOperationException
- when working with a single document
created from fromSingleUri(Context, Uri)
.DocumentsContract.buildChildDocumentsUriUsingTree(Uri,
String)
public DocumentFile findFile(String displayName)
listFiles()
for the first document matching the
given display name. Returns null
when no matching document is
found.UnsupportedOperationException
- when working with a single document
created from fromSingleUri(Context, Uri)
.public abstract boolean renameTo(String displayName)
displayName
.
Note that this method does not throw IOException
on
failure. Callers must check the return value.
Some providers may need to create a new document to reflect the rename,
potentially with a different MIME type, so getUri()
and
getType()
may change to reflect the rename.
When renaming a directory, children previously enumerated through
listFiles()
may no longer be valid.
displayName
- the new display name.UnsupportedOperationException
- when working with a single document
created from fromSingleUri(Context, Uri)
.DocumentsContract.renameDocument(ContentResolver,
Uri, String)