I've been Googling around but it is sooooo hard to find what manufacturers/models use which path for sdcard/external storage.
Environment.getExternalStorageDirectory()
I know that getExternalStorageDirectory()
sometimes points to external sdcard on some devices.
Here's what I've found some common path for external path (Not sure which manufacturer uses which path):
/emmc
/mnt/sdcard/external_sd
/mnt/external_sd
/sdcard/sd
/mnt/sdcard/bpemmctest
/mnt/sdcard/_ExternalSD
/mnt/sdcard-ext
/mnt/Removable/MicroSD
/Removable/MicroSD
/mnt/external1
/mnt/extSdCard
/mnt/extsd
/mnt/usb_storage <-- usb flash mount
/mnt/extSdCard <-- usb flash mount
/mnt/UsbDriveA <-- usb flash mount
/mnt/UsbDriveB <-- usb flash mount
These are what I found by Googling around.
I need to scan entire internal + external storage + USB flash drive to look for a certain file. If I am missing any path, please add to the above list. If someone knows paths used by each manufacturers, please share with us.
Good news! In KitKat there's now a public API for interacting with these secondary shared storage devices.
The new Context.getExternalFilesDirs()
and Context.getExternalCacheDirs()
methods can return multiple paths, including both primary and secondary devices. You can then iterate over them and check Environment.getStorageState()
and File.getFreeSpace()
to determine the best place to store your files. These methods are also available on ContextCompat
in the support-v4 library.
Also note that if you're only interested in using the directories returned by Context
, you no longer need the READ_
or WRITE_EXTERNAL_STORAGE
permissions. Going forward, you'll always have read/write access to these directories with no additional permissions required.
Apps can also continue working on older devices by end-of-lifing their permission request like this:
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />