在Android 4.2中访问/sdcard

6

我正在开发一款需要直接访问SD卡根目录的应用程序,然而在Android 4.2中,标准的/sdcard目录现在指向运行该应用程序的用户特定的“模拟”SD卡。这不好,因为我的应用程序需要访问存储在SD卡顶层的文件。有人知道如何在Android 4.2中直接访问SD卡吗?


这是一张真正的可移动SD卡吗?在我看过的4.x设备上,实际上并没有sdcard,只有一个在内部存储卷中模拟的sdcard,因此目标是毫无意义的。如果有物理卡,您可以使用adb shell的'mount'命令查看它是如何处理的。 - Chris Stratton
你似乎误解了。即使是虚拟的,也总会有一个/sdcard分区。但是在4.2更新中,/sdcard的处理方式完全不同。访问sdcard分区(在代码中)不再指向真正的/sdcard,而是指向一个特定于当前用户的虚拟“分区”。请记住,我正在开发的应用程序在4.2以下的Android版本上,无论设备如何,都可以正常工作。 - Drew
请查看ROM Manager的开发者Koushik Dutta发布的帖子,他抱怨了同样的问题。https://plus.google.com/103583939320326217147/posts/D7mZBjTJj5j - Drew
请参考 https://android.googlesource.com/platform/docs/source.android.com/+/master/src/tech/storage/index.md。在启动时,系统会挂载一个单独的模拟外部存储FUSE守护程序到`EMULATED_STORAGE_SOURCE`,该守护程序对应用程序是隐藏的。在Zygote分叉之后,系统会将适当的用户特定子目录从FUSE守护程序下面的目录绑定到`EMULATED_STORAGE_TARGET`,以便应用程序正确解析外部存储路径。因为应用程序缺少其他用户存储的可访问挂载点,所以它们只能访问启动时所属用户的存储,因此可能需要root权限。 - Chris Stratton
2个回答

1

你能将存储目录用作文件类型吗?(java.io.File)

如果可以的话,你可以在你的方法中使用以下代码获取外部存储(通常是SD卡,但在没有SD卡的手机上将是主存储):

File path = Environment.getExternalStorageDirectory();

此外,访问存储需要在您的Android清单中具有READ_EXTERNAL_STORAGE权限 - 如果修改任何数据,则需要WRITE_EXTERNAL_STORAGE。以下是这些权限在清单中的显示方式:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

来源:

http://developer.android.com/reference/android/os/Environment.html http://developer.android.com/reference/android/Manifest.permission.html


这是我目前使用的方法,但问题在于在Android 4.2中,它并不会重定向到实际的根目录 /sdcard(ExternalStorageDirectory)分区,而是指向了 /sdcard(ExternalStorageDirectory)分区上的特定用户位置。 - Drew
啊,我明白了 - 对不起,我误解了你的问题。 - Alex6642122

1
也许我误解了你的问题,但是在我的Nexus Galaxy上运行Android 4.2.1时,我可以使用Environment.getExternalStorageDirectory()访问我的SD卡。返回的目录是/storage/emulated/0,但内容是/sdcard的内容。

有一些关于存储的文档,但是在4.4 source.android.com/devices/tech/storage/config-example.html和doubleencore.com/2014/03/android-external-storage上也有相关信息。 - pevik

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