我已经发现在某些设备上可以将externalStorage设置为设备存储,就像我的三星Galaxy 4 10.1和5.0.2一样。 Android操作系统。
现在的问题是我如何才能将其保存在SD卡上? 例如:
private File makeFolder(String folder) {
File dir = new File(Environment.getExternalStorageDirectory() + "/" + folder + "/");
if (!(dir.exists() && dir.isDirectory())) {
dir.mkdirs();
}
return dir;
}
在我的旧设备上(比如我的Sony Ericson Pro),这个工作正常。那么如何解决这个问题?
答案 0 :(得分:1)
你进入了一个稍微复杂的Android编程领域:)
我不能在这里给你完整的答案,但我可以给出一些指示:
在我见过的几乎所有设备上,Environment.getExternalStorageDirectory()将为您提供模拟SDCARD根目录的路径 - 这不是物理SD卡。制造商可以自由地将物理SDCARD映射到此路径 - 但通常,他们使用内部存储器模拟SDCARD)
在Kitkat之前,甚至没有可用于确定物理SDCARD存在的API。
从Kitkat开始,您可以通过检查appContext.getExternalFilesDirs()的结果来查看是否存在物理SDCARD,它将为您提供所有可用的应用程序的私有数据目录路径存储媒体。
如果存在并挂载物理SDCARD,appContext.getExternalFilesDirs()将为您提供两个路径结果。然后第一个用于模拟SDCARD。您可能会注意到此路径将包含由Environment.getExternalStorageDirectory()返回的相同子路径。
以下示例将使此更清晰。我假设一个三星S4插入并安装了一个真正的SDCARD
返回的第一个路径是:
/storage/emulated/0/Android/data/com.example.yourapp/files。
第二条路径很有趣 - 因为此路径是您在真实物理SD卡上的应用程序可访问区域。此路径的格式为:
/storage/extSdCard/Android/data/com.example.yourapp/files
这是您在Kitkat中拥有写入权限的唯一途径。
因此,从Kitkat开始,从这两条路径出现(并添加了对已安装的SDCARD的检查),您可以轻松找出您的应用是否在具有真实SDCARD的手机上运行。您甚至可以解析第二条路径以获取真实SDCARD的根目录(只需从此路径中删除/ Android / ... substring)
是的,现在你知道为什么你在Kitkat的真实SDCARD如此受限制了。如上面的斜体所示,您只能在Kitkat的物理SDCARd上对该目录进行写访问。
棉花糖现在来了,事情再次发生变化。在Marshmallow中,您有一个存储框架,您可以使用该框架向用户显示权限对话框,并且您可以告诉他授予您的应用程序对其中任何设备或目录的完全访问权限。请搜索" Intent.ACTION_OPEN_DOCUMENT_TREE"很好的教程。
因此,简而言之,到目前为止,在Android中处理SDCARD没有很好的方法,SDCARD在所有版本中均匀运行。在Kitkat之前,它是一个灰色的区域,在Kitkat,你受到严格的限制,而在Lollipop中,你会遇到一个系统Activity,它有一个荒谬的GUI用于许可,而不是那么容易使用的框架。