阅读有关存储文件的 Android 文档后,我发现外部存储可以包括可移动 SD 卡和设备内部存储(即不可移动)。选择将文件保存到外部存储时,是否可以区分可移动存储和不可移动存储?
我认为您无法可靠地区分内部和外部(SD)存储。
乍一看,您似乎可以使用类似的东西Environment.isExternalStorageRemovable()
但这并不可靠,因为您的“主要外部”存储设备很可能是设备的内部存储器,而不是 SD 卡。
该文档用于Environment.getExternalStorageDirectory() http://developer.android.com/reference/android/os/Environment.html states:
注意:不要对这里的“外部”一词感到困惑。该目录可以更好地被视为媒体/共享存储。它是一个可以容纳相对大量数据并且在所有应用程序之间共享的文件系统(不强制执行权限)。传统上,这是一张 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 返回的值证明设备正在使用内部存储器作为其“主要外部”存储:
- 环境.getExternalStorageState:mounted
- 环境.isExternalStorageEmulated:true
- Environment.isExternalStorageRemovable:false
- Context.getExternalCacheDir:/存储/emulated/0/Android/data/com.codeblast.storagetype/cache
- Context.getExternalFilesDir:/存储/emulated/0/Android/data/com.codeblast.storagetype/files
在没有外部 SD 卡的模拟器上运行代码会返回完全相同的结果。
所以你不能假设/mnt/sdcard
指物理 SD 卡。
您可能已经重新考虑您实际想要完成的任务,而不是尝试检测存储类型。 :-)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)