安卓外部存储与SD卡的区别

6

在阅读了Android存储文件的文档后,我发现外部存储可以包括可移动的SD卡和设备内部的存储,即不可移动的存储。在选择将文件保存到外部存储时,是否有办法区分可移动存储和不可移动存储?


https://dev59.com/LWsz5IYBdhLWcg3w2Lpu - G. Lombard
https://dev59.com/bWct5IYBdhLWcg3wctCG - G. Lombard
1个回答

8

我认为您无法可靠地区分内部存储和外部(SD)存储。

乍一看,似乎可以使用类似于Environment.isExternalStorageRemovable()的东西,但这并不可靠,因为您的“主要外部”存储设备很可能是设备的内部存储器,而不是SD卡。

Environment.getExternalStorageDirectory()的文档说明:

注意:不要被这里的“外部”字眼所迷惑。最好将此目录视为媒体/共享存储。它是一个可以容纳相对较大数据量且在所有应用程序之间共享的文件系统(不强制执行权限)。传统上,这是一个SD卡,但也可以实现为设备中与受保护的内部存储不同的内置存储,并且可以在计算机上作为文件系统挂载。

例如,我的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返回的值表明设备正在使用内部存储作为其“主要外部”存储:
  • Environment.getExternalStorageState: mounted
  • Environment.isExternalStorageEmulated: true
  • Environment.isExternalStorageRemovable: false
  • Context.getExternalCacheDir: /storage/emulated/0/Android/data/com.codeblast.storagetype/cache
  • Context.getExternalFilesDir: /storage/emulated/0/Android/data/com.codeblast.storagetype/files
在没有外部SD卡的模拟器上运行代码将返回完全相同的结果。因此,您不能假定/mnt/sdcard表示物理SD卡。您可能需要重新考虑您实际想要完成的任务,而不是尝试检测存储类型。 :-)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接