Android 外部存储与 SD 卡
Android External Storage vs. SD Card
阅读有关存储文件的 Android 文档后,我发现外部存储可以包括可移动的 SD 卡和设备内部的存储,即不可移动的。选择将文件保存到外部存储时,有没有办法区分可移动存储和不可移动存储?
我认为您无法可靠地区分内部和外部 (SD) 存储。
乍一看,您似乎可以使用 Environment.isExternalStorageRemovable()
之类的东西,但这并不可靠,因为您的 "primary external" 存储设备很可能是设备的内部存储器,而不是 SD卡.
Environment.getExternalStorageDirectory()
的文档指出:
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.
举个例子,我的LG G4安装了外接SD卡,用adb可以看到(external_SD
):
$ adb shell ls -la /storage/
drwx------ root root 2015-02-28 01:10 USBstorage1
drwx------ root root 2015-02-28 01:10 USBstorage2
drwx------ root root 2015-02-28 01:10 USBstorage3
drwx------ root root 2015-02-28 01:10 USBstorage4
drwx------ root root 2015-02-28 01:10 USBstorage5
drwx------ root root 2015-02-28 01:10 USBstorage6
dr-xr-xr-x root root 2015-02-28 01:10 emulated
drwxrwx--x root sdcard_r 2015-07-31 08:19 external_SD
lrwxrwxrwx root root 2015-02-28 01:10 sdcard0 -> /storage/emulated/legacy
但是,用于外部存储的各种 API return 值证明设备正在使用内部存储器作为其 "primary external" 存储:
- Environment.getExternalStorageState: 挂载
- Environment.isExternalStorageEmulated: 真
- Environment.isExternalStorageRemovable: 假
- Context.getExternalCacheDir: /storage/模拟/0/Android/data/com.codeblast.storagetype/cache
- Context.getExternalFilesDir: /storage/模拟/0/Android/data/com.codeblast.storagetype/files
运行 在没有外置 SD 卡的模拟器上的代码 return 结果完全相同。
所以你不能假设/mnt/sdcard
是物理SD卡。
您可能已经重新考虑了您实际尝试完成的任务,而不是尝试检测存储类型。 :-)
阅读有关存储文件的 Android 文档后,我发现外部存储可以包括可移动的 SD 卡和设备内部的存储,即不可移动的。选择将文件保存到外部存储时,有没有办法区分可移动存储和不可移动存储?
我认为您无法可靠地区分内部和外部 (SD) 存储。
乍一看,您似乎可以使用 Environment.isExternalStorageRemovable()
之类的东西,但这并不可靠,因为您的 "primary external" 存储设备很可能是设备的内部存储器,而不是 SD卡.
Environment.getExternalStorageDirectory()
的文档指出:
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.
举个例子,我的LG G4安装了外接SD卡,用adb可以看到(external_SD
):
$ adb shell ls -la /storage/
drwx------ root root 2015-02-28 01:10 USBstorage1
drwx------ root root 2015-02-28 01:10 USBstorage2
drwx------ root root 2015-02-28 01:10 USBstorage3
drwx------ root root 2015-02-28 01:10 USBstorage4
drwx------ root root 2015-02-28 01:10 USBstorage5
drwx------ root root 2015-02-28 01:10 USBstorage6
dr-xr-xr-x root root 2015-02-28 01:10 emulated
drwxrwx--x root sdcard_r 2015-07-31 08:19 external_SD
lrwxrwxrwx root root 2015-02-28 01:10 sdcard0 -> /storage/emulated/legacy
但是,用于外部存储的各种 API return 值证明设备正在使用内部存储器作为其 "primary external" 存储:
- Environment.getExternalStorageState: 挂载
- Environment.isExternalStorageEmulated: 真
- Environment.isExternalStorageRemovable: 假
- Context.getExternalCacheDir: /storage/模拟/0/Android/data/com.codeblast.storagetype/cache
- Context.getExternalFilesDir: /storage/模拟/0/Android/data/com.codeblast.storagetype/files
运行 在没有外置 SD 卡的模拟器上的代码 return 结果完全相同。
所以你不能假设/mnt/sdcard
是物理SD卡。
您可能已经重新考虑了您实际尝试完成的任务,而不是尝试检测存储类型。 :-)