当使用Eclipse文件浏览器浏览我的android目录时,我看到了mnt/sdcard
和mnt/sdcard2
,见下图:
调用Environment.getExternalStorageDirectory()
时会返回mnt/sdcard
,因此我认为mnt/sdcad
是external storage
,mnt/sdcard2
是我的实际SD卡,是真的?我如何使用代码访问mnt/sdcard2
下的文件?
P.S。
似乎我可以直接访问外部SD卡:
File extStorageDir = Environment.getExternalStorageDirectory();
String parent = extStorageDir.getParent();
File extSdCardDir = new File(parent+"/sdcard2");
File file = new File(extSdCardDir, "DemoFile.jpg");
但我不知道额外的SD卡会在其他情况下改名。
答案 0 :(得分:1)
您是对的,getExternalStorage
将返回您的内置外部存储空间。不幸的是,如果该设备还具有内置存储器和SD卡,则Jelly Bean应用程序不再能够使用SD卡。您可以尝试通过shell命令或硬编码路径来解决它,但是没有root,就没有可靠的方法来访问它了。
这是最近添加的Android CTS,所有OEM必须遵守这些才能使用Play商店。
Compatibility Program Overview | Android Developers
Section 9.5 (pg. 34) of Android 4.3 Compatibility Definition
包含多个外部存储路径的设备实施 绝不允许Android应用程序写入辅助外部 存储
Storage Options | Android Developers
设备可能使用内部存储分区 对于外部存储器也可以提供SD卡插槽。在这种情况下, SD卡不是外部存储的一部分,您的应用程序不能 访问它(额外的存储仅用于用户提供的媒体 系统扫描)。
Android 4.2 APIs | Android Developers
在多用户环境中保存数据
每当您的应用保存用户首选项,创建数据库或 将文件写入用户的内部或外部存储空间,即 只有在以该用户身份运行时才能访问数据。
确保您的应用在多用户中正常运行 环境,不要引用您的内部应用程序目录或外部 存储位置使用硬编码路径,而是始终使用 适当的API:
For access to internal storage, use getFilesDir(), getCacheDir(), or openFileOutput(). For access to external storage, use getExternalFilesDir() or getExternalStoragePublicDirectory().
无论您使用哪种API来保存给定用户的数据, 以其他用户身份运行时,无法访问这些数据。 从您的应用程序的角度来看,每个用户都在完全运行 单独的设备。