StorageManager
public
class
StorageManager
extends Object
| java.lang.Object | |
| ↳ | android.os.storage.StorageManager |
StorageManager is the interface to the systems storage service. The storage manager handles storage-related items such as Opaque Binary Blobs (OBBs).
OBBs contain a filesystem that maybe be encrypted on disk and mounted on-demand from an application. OBBs are a good way of providing large amounts of binary assets without packaging them into APKs as they may be multiple gigabytes in size. However, due to their size, they're most likely stored in a shared storage pool accessible from all programs. The system does not guarantee the security of the OBB file itself: if any program modifies the OBB, there is no guarantee that a read from that OBB will produce the expected output.
Get an instance of this class by calling
getSystemService(java.lang.String) with an
argument of STORAGE_SERVICE.
Summary
Constants | |
|---|---|
String |
ACTION_MANAGE_STORAGE
Activity Action: Allows the user to manage their storage. |
String |
EXTRA_REQUESTED_BYTES
Extra used to indicate the total size (in bytes) that an application is interested in allocating. |
String |
EXTRA_UUID
Extra |
Fields | |
|---|---|
public
static
final
UUID |
UUID_DEFAULT
UUID representing the default internal storage of this device which
provides |
Public methods | |
|---|---|
void
|
allocateBytes(FileDescriptor fd, long bytes)
Allocate the requested number of bytes for your application to use in the given open file. |
void
|
allocateBytes(UUID storageUuid, long bytes)
Allocate the requested number of bytes for your application to use on the given storage volume. |
long
|
getAllocatableBytes(UUID storageUuid)
Return the maximum number of new bytes that your app can allocate for itself on the given storage volume. |
long
|
getCacheQuotaBytes(UUID storageUuid)
Return quota size in bytes for all cached data belonging to the calling app on the given storage volume. |
long
|
getCacheSizeBytes(UUID storageUuid)
Return total size in bytes of all cached data belonging to the calling app on the given storage volume. |
String
|
getMountedObbPath(String rawPath)
Check the mounted path of an Opaque Binary Blob (OBB) file. |
StorageVolume
|
getPrimaryStorageVolume()
Return the primary shared/external storage volume available to the current user. |
StorageVolume
|
getStorageVolume(File file)
Return the |
List<StorageVolume>
|
getStorageVolumes()
Return the list of shared/external storage volumes available to the current user. |
UUID
|
getUuidForPath(File path)
Return a UUID identifying the storage volume that hosts the given filesystem path. |
boolean
|
isCacheBehaviorGroup(File path)
Read the current value set by
|
boolean
|
isCacheBehaviorTombstone(File path)
Read the current value set by
|
boolean
|
isEncrypted(File file)
Return if data stored at or under the given path will be encrypted while at rest. |
boolean
|
isObbMounted(String rawPath)
Check whether an Opaque Binary Blob (OBB) is mounted or not. |
boolean
|
mountObb(String rawPath, String key, OnObbStateChangeListener listener)
Mount an Opaque Binary Blob (OBB) file. |
ParcelFileDescriptor
|
openProxyFileDescriptor(int mode, ProxyFileDescriptorCallback callback, Handler handler)
Opens seekable ParcelFileDescriptor that routes file operation requests to ProxyFileDescriptorCallback. |
void
|
setCacheBehaviorGroup(File path, boolean group)
Enable or disable special cache behavior that treats this directory and its contents as an entire group. |
void
|
setCacheBehaviorTombstone(File path, boolean tombstone)
Enable or disable special cache behavior that leaves deleted cache files intact as tombstones. |
boolean
|
unmountObb(String rawPath, boolean force, OnObbStateChangeListener listener)
Unmount an Opaque Binary Blob (OBB) file asynchronously. |
Inherited methods | |
|---|---|
java.lang.Object
| |
Constants
ACTION_MANAGE_STORAGE
String ACTION_MANAGE_STORAGE
Activity Action: Allows the user to manage their storage. This activity provides the ability to free up space on the device by deleting data such as apps.
If the sending application has a specific storage device or allocation
size in mind, they can optionally define EXTRA_UUID or
EXTRA_REQUESTED_BYTES, respectively.
Constant Value: "android.os.storage.action.MANAGE_STORAGE"
EXTRA_REQUESTED_BYTES
String EXTRA_REQUESTED_BYTES
Extra used to indicate the total size (in bytes) that an application is interested in allocating.
When defined, the management UI will help guide the user to free up enough disk space to reach this requested value.
See also:
Constant Value: "android.os.storage.extra.REQUESTED_BYTES"
EXTRA_UUID
String EXTRA_UUID
Extra UUID used to indicate the storage volume where an
application is interested in allocating or managing disk space.
See also:
Constant Value: "android.os.storage.extra.UUID"
Fields
UUID_DEFAULT
UUID UUID_DEFAULT
UUID representing the default internal storage of this device which
provides getDataDirectory().
This value is constant across all devices and it will never change, and thus it cannot be used to uniquely identify a particular physical device.
See also:
Public methods
allocateBytes
void allocateBytes (FileDescriptor fd, long bytes)
Allocate the requested number of bytes for your application to use in the given open file. This will cause the system to delete any cached files necessary to satisfy your request.
Attempts to allocate disk space beyond the value returned by
ERROR(/#getAllocatableBytes(UUID, int)) will fail.
This method guarantees that bytes have been allocated to the opened file, otherwise it will throw if fast allocation is not possible. Fast allocation is typically only supported in private app data directories, and on shared/external storage devices which are emulated.
| Parameters | |
|---|---|
fd |
FileDescriptor: the open file that you'd like to allocate disk space for. |
bytes |
long: the number of bytes to allocate. This is the desired final
size of the open file. If the open file is smaller than this
requested size, it will be extended without modifying any
existing contents. If the open file is larger than this
requested size, it will be truncated.Value is a non-negative number of bytes. |
| Throws | |
|---|---|
IOException |
when the storage device isn't present, or when it doesn't support allocating space, or if the device had trouble allocating the requested space. |
allocateBytes
void allocateBytes (UUID storageUuid, long bytes)
Allocate the requested number of bytes for your application to use on the given storage volume. This will cause the system to delete any cached files necessary to satisfy your request.
Attempts to allocate disk space beyond the value returned by
ERROR(/#getAllocatableBytes(UUID, int)) will fail.
Since multiple apps can be running simultaneously, this method may be
subject to race conditions. If possible, consider using
ERROR(/#allocateBytes(FileDescriptor, long, int)) which will guarantee
that bytes are allocated to an opened file.
| Parameters | |
|---|---|
storageUuid |
UUID: the UUID of the storage volume where you'd like to
allocate disk space. The UUID for a specific path can be
obtained using getUuidForPath(File).This value must never be |
bytes |
long: the number of bytes to allocate.Value is a non-negative number of bytes. |
| Throws | |
|---|---|
IOException |
when the storage device isn't present, or when it doesn't support allocating space, or if the device had trouble allocating the requested space. |
See also:
getAllocatableBytes
long getAllocatableBytes (UUID storageUuid)
Return the maximum number of new bytes that your app can allocate for
itself on the given storage volume. This value is typically larger than
getUsableSpace(), since the system may be willing to delete
cached files to satisfy an allocation request. You can then allocate
space for yourself using ERROR(/#allocateBytes(UUID, long, int)) or
ERROR(/#allocateBytes(FileDescriptor, long, int)).
This method is best used as a pre-flight check, such as deciding if there is enough space to store an entire music album before you allocate space for each audio file in the album. Attempts to allocate disk space beyond the returned value will fail.
If the returned value is not large enough for the data you'd like to
persist, you can launch ACTION_MANAGE_STORAGE with the
EXTRA_UUID and EXTRA_REQUESTED_BYTES options to help
involve the user in freeing up disk space.
Note: if your app uses the android:sharedUserId manifest feature,
then allocatable space for all packages in your shared UID is tracked
together as a single unit.
Value is a non-negative number of bytes.
| Parameters | |
|---|---|
storageUuid |
UUID: the UUID of the storage volume where you're
considering allocating disk space, since allocatable space can
vary widely depending on the underlying storage device. The
UUID for a specific path can be obtained using
getUuidForPath(File).This value must never be |
| Returns | |
|---|---|
long |
the maximum number of new bytes that the calling app can allocate
using ERROR(/#allocateBytes(UUID, long, int)) or
ERROR(/#allocateBytes(FileDescriptor, long, int)).Value is a non-negative number of bytes. |
| Throws | |
|---|---|
IOException |
when the storage device isn't present, or when it doesn't support allocating space. |
getCacheQuotaBytes
long getCacheQuotaBytes (UUID storageUuid)
Return quota size in bytes for all cached data belonging to the calling app on the given storage volume.
If your app goes above this quota, your cached files will be some of the first to be deleted when additional disk space is needed. Conversely, if your app stays under this quota, your cached files will be some of the last to be deleted when additional disk space is needed.
This quota will change over time depending on how frequently the user interacts with your app, and depending on how much system-wide disk space is used.
Note: if your app uses the android:sharedUserId manifest feature,
then cached data for all packages in your shared UID is tracked together
as a single unit.
This method may take several seconds to complete, so it should only be called from a worker thread.
Value is a non-negative number of bytes.
| Parameters | |
|---|---|
storageUuid |
UUID: the UUID of the storage volume that you're interested
in. The UUID for a specific path can be obtained using
getUuidForPath(File).This value must never be |
| Returns | |
|---|---|
long |
Value is a non-negative number of bytes. |
| Throws | |
|---|---|
IOException |
when the storage device isn't present, or when it doesn't support cache quotas. |
See also:
getCacheSizeBytes
long getCacheSizeBytes (UUID storageUuid)
Return total size in bytes of all cached data belonging to the calling app on the given storage volume.
Cached data tracked by this method always includes
getCacheDir() and getCodeCacheDir(), and
it also includes getExternalCacheDir() if the primary
shared/external storage is hosted on the same storage device as your
private data.
Note: if your app uses the android:sharedUserId manifest feature,
then cached data for all packages in your shared UID is tracked together
as a single unit.
This method may take several seconds to complete, so it should only be called from a worker thread.
Value is a non-negative number of bytes.
| Parameters | |
|---|---|
storageUuid |
UUID: the UUID of the storage volume that you're interested
in. The UUID for a specific path can be obtained using
getUuidForPath(File).This value must never be |
| Returns | |
|---|---|
long |
Value is a non-negative number of bytes. |
| Throws | |
|---|---|
IOException |
when the storage device isn't present, or when it doesn't support cache quotas. |
See also:
getMountedObbPath
String getMountedObbPath (String rawPath)
Check the mounted path of an Opaque Binary Blob (OBB) file. This will give you the path to where you can obtain access to the internals of the OBB.
| Parameters | |
|---|---|
rawPath |
String: path to OBB image |
| Returns | |
|---|---|
String |
absolute path to mounted OBB image data or null if
not mounted or exception encountered trying to read status
|
getPrimaryStorageVolume
StorageVolume getPrimaryStorageVolume ()
Return the primary shared/external storage volume available to the
current user. This volume is the same storage device returned by
getExternalStorageDirectory() and
getExternalFilesDir(String).
| Returns | |
|---|---|
StorageVolume |
This value will never be |
getStorageVolume
StorageVolume getStorageVolume (File file)
Return the StorageVolume that contains the given file, or null if none.
| Parameters | |
|---|---|
file |
File |
| Returns | |
|---|---|
StorageVolume |
This value may be |
getStorageVolumes
List<StorageVolume> getStorageVolumes ()
Return the list of shared/external storage volumes available to the current user. This includes both the primary shared storage device and any attached external volumes including SD cards and USB drives.
| Returns | |
|---|---|
List<StorageVolume> |
This value will never be |
getUuidForPath
UUID getUuidForPath (File path)
Return a UUID identifying the storage volume that hosts the given filesystem path.
If this path is hosted by the default internal storage of the device at
getDataDirectory(), the returned value will be
UUID_DEFAULT.
| Parameters | |
|---|---|
path |
File This value must never be |
| Returns | |
|---|---|
UUID |
This value will never be |
| Throws | |
|---|---|
IOException |
when the storage device at the given path isn't present, or when it doesn't have a valid UUID. |
isCacheBehaviorGroup
boolean isCacheBehaviorGroup (File path)
Read the current value set by
setCacheBehaviorGroup(File, boolean).
| Parameters | |
|---|---|
path |
File |
| Returns | |
|---|---|
boolean |
|
| Throws | |
|---|---|
IOException |
|
isCacheBehaviorTombstone
boolean isCacheBehaviorTombstone (File path)
Read the current value set by
setCacheBehaviorTombstone(File, boolean).
| Parameters | |
|---|---|
path |
File |
| Returns | |
|---|---|
boolean |
|
| Throws | |
|---|---|
IOException |
|
isEncrypted
boolean isEncrypted (File file)
Return if data stored at or under the given path will be encrypted while at rest. This can help apps avoid the overhead of double-encrypting data.
| Parameters | |
|---|---|
file |
File |
| Returns | |
|---|---|
boolean |
|
isObbMounted
boolean isObbMounted (String rawPath)
Check whether an Opaque Binary Blob (OBB) is mounted or not.
| Parameters | |
|---|---|
rawPath |
String: path to OBB image |
| Returns | |
|---|---|
boolean |
true if OBB is mounted; false if not mounted or on error |
mountObb
boolean mountObb (String rawPath, String key, OnObbStateChangeListener listener)
Mount an Opaque Binary Blob (OBB) file. If a key is
specified, it is supplied to the mounting process to be used in any
encryption used in the OBB.
The OBB will remain mounted for as long as the StorageManager reference
is held by the application. As soon as this reference is lost, the OBBs
in use will be unmounted. The OnObbStateChangeListener registered
with this call will receive the success or failure of this operation.
Note: you can only mount OBB files for which the OBB tag on the file matches a package ID that is owned by the calling program's UID. That is, shared UID applications can attempt to mount any other application's OBB that shares its UID.
| Parameters | |
|---|---|
rawPath |
String: the path to the OBB file |
key |
String: secret used to encrypt the OBB; may be null if no
encryption was used on the OBB. |
listener |
OnObbStateChangeListener: will receive the success or failure of the operation |
| Returns | |
|---|---|
boolean |
whether the mount call was successfully queued or not |
openProxyFileDescriptor
ParcelFileDescriptor openProxyFileDescriptor (int mode, ProxyFileDescriptorCallback callback, Handler handler)
Opens seekable ParcelFileDescriptor that routes file operation requests to ProxyFileDescriptorCallback.
| Parameters | |
|---|---|
mode |
int: The desired access mode, must be one of
MODE_READ_ONLY,
MODE_WRITE_ONLY, or
MODE_READ_WRITE |
callback |
ProxyFileDescriptorCallback: Callback to process file operation requests issued on returned file
descriptor. |
handler |
Handler: Handler that invokes callback methods. |
| Returns | |
|---|---|
ParcelFileDescriptor |
Seekable ParcelFileDescriptor. This value will never be |
| Throws | |
|---|---|
IOException |
|
setCacheBehaviorGroup
void setCacheBehaviorGroup (File path, boolean group)
Enable or disable special cache behavior that treats this directory and its contents as an entire group.
When enabled and this directory is considered for automatic deletion by the OS, all contained files will either be deleted together, or not at all. This is useful when you have a directory that contains several related metadata files that depend on each other, such as movie file and a subtitle file.
When enabled, the newest lastModified() value of
any contained files is considered the modified time of the entire
directory.
This behavior can only be set on a directory, and it applies recursively to all contained files and directories.
| Parameters | |
|---|---|
path |
File |
group |
boolean |
| Throws | |
|---|---|
IOException |
|
setCacheBehaviorTombstone
void setCacheBehaviorTombstone (File path, boolean tombstone)
Enable or disable special cache behavior that leaves deleted cache files intact as tombstones.
When enabled and a file contained in this directory is automatically deleted by the OS, the file will be truncated to have a length of 0 bytes instead of being fully deleted. This is useful if you need to distinguish between a file that was deleted versus one that never existed.
This behavior can only be set on a directory, and it applies recursively to all contained files and directories.
Note: this behavior is ignored completely if the user explicitly requests that all cached data be cleared.
| Parameters | |
|---|---|
path |
File |
tombstone |
boolean |
| Throws | |
|---|---|
IOException |
|
unmountObb
boolean unmountObb (String rawPath, boolean force, OnObbStateChangeListener listener)
Unmount an Opaque Binary Blob (OBB) file asynchronously. If the
force flag is true, it will kill any application needed to
unmount the given OBB (even the calling application).
The OnObbStateChangeListener registered with this call will
receive the success or failure of this operation.
Note: you can only mount OBB files for which the OBB tag on the file matches a package ID that is owned by the calling program's UID. That is, shared UID applications can obtain access to any other application's OBB that shares its UID.
| Parameters | |
|---|---|
rawPath |
String: path to the OBB file |
force |
boolean: whether to kill any programs using this in order to unmount
it |
listener |
OnObbStateChangeListener: will receive the success or failure of the operation |
| Returns | |
|---|---|
boolean |
whether the unmount call was successfully queued or not |