从android 6.0开始,sdcard路径不再是“/storage/sdcard1/”、“/storage/sdcard-ext/”什么的。
路径取决于电话。如果我使用 Nexus 5x AVD,路径是“/storage/1D15-3A1B/”。当我使用 Nexus 6p AVD 时,路径是“/storage/4679-1802/”。那么如何在程序中动态写入sdcard路径来定位外部sdcard中的文件呢?
谢谢!
从android 6.0开始,sdcard路径不再是“/storage/sdcard1/”、“/storage/sdcard-ext/”什么的。
路径取决于电话。如果我使用 Nexus 5x AVD,路径是“/storage/1D15-3A1B/”。当我使用 Nexus 6p AVD 时,路径是“/storage/4679-1802/”。那么如何在程序中动态写入sdcard路径来定位外部sdcard中的文件呢?
谢谢!
我尝试了很多方法,包括:
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)
Environment.getExternalStorageDirectory()
我的应用程序仍然看不到我在 DCIM/Camera 中的图片文件。我可以看到目录名称,但这些目录中的任何一个上的 listFiles() 返回 null。最后,不好意思地,我发现我的 Manifest 没有包含神奇的行 android.permission.WRITE_EXTERNAL_STORAGE。一旦我添加了权限,它就像一个魅力。
故事的寓意:在这种情况下,Android 不会警告/中断/抛出异常。当它失败时,它会默默地失败!
看来我找到了解决方案。
我正在使用访问存储框架。我通过处理 uri 字符串并获取“1D15-3A1B”部分来获取它,然后将其组合到 sdcard 路径。这是解决方案。
Welcome to Word.docx
sdcard 根路径中的文件时,我得到了intent
by onActivityResult()
。String docId = DocumentsContract.getDocumentId(intent.getData())
,因此字符串docId
为"1D15-3A1B:Welcome to Word.docx"
。String[] split = docId.split(":")
,这样就可以得到"1D15-3A1B"
哪个是split[0]
,sdcard中的路径"Welcome to Word.docx"
是split[1]
。String newPath = "/storage/" + split[0] + "/" + split[1]
。更新:实际上getExternalFilesDirs()
这样做更容易......谢谢@greenapps!
看看getExternalFilesDirs()
。