-1

由于android 6.0,sdcard路径不再是“/ storage/sdcard1 /”,“/ storage/sdcard-ext /”之类的东西。在android 6.0中找不到sdcard文件(不是硬代码)

路径取决于电话。如果我使用Nexus 5x AVD,路径为“/ storage/1D15-3A1B /”。当我使用Nexus 6p AVD时,路径为“/ storage/4679-1802 /”。那么我该如何在程序中动态地写入sdcard路径来查找外部sdcard中的文件呢?

谢谢!

+3

不是Environment.getExternalStorageDirectory()。getAbsolutePath();工作了? – Frame91

+3

@ Frame91是正确的。你永远不应该使用任何这些路径,它总是依靠电话。如果您使用的是在大多数设备上失败的那些,那么这些甚至不是6.0之前最常见的路径。 –

+1

永远不要依赖硬编码路径! –

回答

0

看一看getExternalFilesDirs()

+0

感谢您的回复。我看着这个功能。但它仍然会返回到“模拟”路径... –

+0

它将返回一组路径。第二项是SD卡的路径。它真的... FilesDirs不是... FilesDir。 – greenapps

+0

我刚读过这个评论。是的,'getExternalFilesDirs()'更容易做到这一点......我误以为'getExternalFilesDir()'而不是! @greenapps –

0

看来我找到了解决方案。

我正在使用访问存储框架。我通过处理uri字符串得到它并获得“1D15-3A1B”部分,然后将其组合到SD卡路径。这是解决方案。

  1. 当我点击SD卡的根路径的文件Welcome to Word.docx,我得到intent通过onActivityResult()
  2. 获得文档编号String docId = DocumentsContract.getDocumentId(intent.getData()),因此字符串docId"1D15-3A1B:Welcome to Word.docx"
  3. 拆分字符串并按String[] split = docId.split(":")得到一个字符串数组,所以我们可以得到"1D15-3A1B"这是split[0],并且sdcard "Welcome to Word.docx"中的路径是split[1]
  4. 如果我们想要得到我们之前点击的文件的URI,只需要建立一个新的字符串String newPath = "/storage/" + split[0] + "/" + split[1]

更新: 其实getExternalFilesDirs()更容易做到这一点...谢谢@greenapps!

+0

请说明您的工作方式和做法。 – greenapps

+0

@greenapps sry我是新来的......我现在编辑解决方案。 –

+0

如果你在/ storage中使用文件浏览器查看,你会看到它。 – greenapps

0

我尝试很多方法,包括:在DCIM /摄像机

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) 
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) 
Environment.getExternalStorageDirectory() 

不过我的图片文件是不可见的,我的应用程序。我可以看到目录名,但是这些目录中的任何一个的listFiles()都返回null。 最后,怯懦地,我发现我的Manifest没有包含魔术线android.permission.WRITE_EXTERNAL_STORAGE。 一旦我添加了权限,它就像一个魅力。

故事的道德:在这种情况下,Android不会警告/打破/抛出异常。当它失败时,它会默默地失败!

相关问题