【问题标题】:Can not locate the sdcard file(not hard code) in android 6.0在 android 6.0 中找不到 sdcard 文件(不是硬代码)
【发布时间】:2016-07-28 22:08:19
【问题描述】:

从android 6.0开始,sdcard路径不再是“/storage/sdcard1/”、“/storage/sdcard-ext/”什么的。

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

谢谢!

【问题讨论】:

  • 不是 Environment.getExternalStorageDirectory().getAbsolutePath();工作了吗?
  • @Frame91 是正确的。您永远不应该使用任何这些路径,它始终取决于手机。如果您使用的是在大多数设备上失败的路径,那么这些甚至不是 6.0 之前最常见的路径。
  • 永远不要依赖硬编码的路径!
  • @Frame91 是的。对不起,我没有说清楚......这只位于“/storage/emulated/0/”路径。它是外部存储。但是我想问第二个外部存储路径还是可移动sdcard路径。
  • @Rotwang 是的。 android 工厂有这么多,每一个都不一样……

标签: android android-6.0-marshmallow android-sdcard mobile-development


【解决方案1】:

看看getExternalFilesDirs()

【讨论】:

  • 感谢您的回复。我研究了这个功能。但它仍然返回“模拟”路径......
  • 它将返回一个路径数组。第二项是 SD 卡的路径。它真的是 ...FilesDirs 而不是 ...FilesDir。
  • 我刚刚阅读了这条评论。是的,getExternalFilesDirs() 更容易做到这一点......我误认为是getExternalFilesDir()! @greenapps
  • 这是适用于 Android 6 及更高版本的方式。并且通常适用于 Android 5。
【解决方案2】:

看来我找到了解决办法。

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

  1. 当我单击 sdcard 根路径中的文件 Welcome to Word.docx 时,我会通过 onActivityResult() 获得 intent
  2. 通过String docId = DocumentsContract.getDocumentId(intent.getData())获取DocumentId,因此字符串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!

【讨论】:

  • @greenapps 对不起,我是新来的……我现在将编辑解决方案。
  • 如果您在 /storage 中使用文件资源管理器进行查看,您就会看到它。
  • @greenapps 是的...实际上很容易弄清楚。我想找到一种方法来获取"1D15-3A1B" 而不是硬编码。
【解决方案3】:

我尝试了很多方法,包括:

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

我的应用程序仍然看不到我在 DCIM/Camera 中的图片文件。我可以看到目录名称,但这些目录中的任何一个上的 listFiles() 返回 null。 最后,不好意思地,我发现我的 Manifest 没有包含神奇的 android.permission.WRITE_EXTERNAL_STORAGE 行。 一旦我添加了权限,它就像一个魅力。

故事的寓意:在这种情况下,Android 不会警告/中断/抛出异常。当它失败时,它会默默地失败!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多