Android Guides | Samples

Android.OS.Environment.ExternalStorageDirectory Property

Return the primary external storage directory.


[get: Android.Runtime.Register("getExternalStorageDirectory", "()Ljava/io/File;", "GetGetExternalStorageDirectoryHandler")]
public static File ExternalStorageDirectory { get; }

See Also


Return the primary external storage directory. This directory may not currently be accessible if it has been mounted by the user on their computer, has been removed from the device, or some other problem has happened. You can determine its current state with Environment.ExternalStorageState.

Note: don't be confused by the word "external" here. This directory can better be thought as media/shared storage. It is a filesystem that can hold a relatively large amount of data and that is shared across all applications (does not enforce permissions). Traditionally this is an SD card, but it may also be implemented as built-in storage in a device that is distinct from the protected internal storage and can be mounted as a filesystem on a computer.

On devices with multiple users (as described by UserManager), each user has their own isolated external storage. Applications only have access to the external storage for the user they're running as.

In devices with multiple "external" storage directories, this directory represents the "primary" external storage that the user will interact with. Access to secondary storage is available through

Applications should not directly use this top-level directory, in order to avoid polluting the user's root namespace. Any files that are private to the application should be placed in a directory returned by Context.GetExternalFilesDir(String), which the system will take care of deleting if the application is uninstalled. Other shared files should be placed in one of the directories returned by Environment.GetExternalStoragePublicDirectory(String).

Writing to this path requires the Permission.WriteExternalStorage permission, and starting in read access requires the NoType:android/Manifest$permission;Href=../../../reference/android/Manifest.permission.html#READ_EXTERNAL_STORAGE permission, which is automatically granted if you hold the write permission.

Starting in Build+VERSION_CODES.KitKat, if your application only needs to store internal data, consider using Context.GetExternalFilesDir(String) or Context.ExternalCacheDir, which require no permissions to read or write.

This path may change between platform versions, so applications should only persist relative paths.

Here is an example of typical code to monitor the state of external storage:

java Example

BroadcastReceiver mExternalStorageReceiver;
boolean mExternalStorageAvailable = false;
boolean mExternalStorageWriteable = false;

void updateExternalStorageState() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        mExternalStorageAvailable = mExternalStorageWriteable = true;
    } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
        mExternalStorageAvailable = true;
        mExternalStorageWriteable = false;
    } else {
        mExternalStorageAvailable = mExternalStorageWriteable = false;

void startWatchingExternalStorage() {
    mExternalStorageReceiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            Log.i("test", "Storage: " + intent.getData());
    IntentFilter filter = new IntentFilter();
    registerReceiver(mExternalStorageReceiver, filter);

void stopWatchingExternalStorage() {

[Android Documentation]


Namespace: Android.OS
Assembly: Mono.Android (in Mono.Android.dll)
Assembly Versions:
Since: Added in API level 1