【问题标题】:How to get the real path with ACTION_OPEN_DOCUMENT_TREE Intent?如何使用 ACTION_OPEN_DOCUMENT_TREE Intent 获取真实路径?
【发布时间】:2015-06-25 03:41:42
【问题描述】:

我的应用下载并解压缩特定文件夹中的文件:

output = new FileOutputStream(realpath, true);
output.write(buffer, 0, bytesRead);

ZipFile zipFile = new ZipFile(realpath);

随着新引入的ACTION_OPEN_DOCUMENT_TREE Intent,我想为用户提供选择该文件夹的机会。

在测试我的onActivityResult 中收到的值时,我得到一个类似/tree/primary:mynewfolder 的路径,它不是像/sdcard/mynewfolder 这样的物理真实路径。

Uri treeUri = data.getData();
String sPath = treeUri.getPath();
Log.v("Path from Tree ", sPath);

我的解压方法需要真实路径:

ZipFile zipFile = new ZipFile(realpath);

如何从 Lollipop (API 21 & 22) 中提供的 URI 中获取像 /sdcard/mynewfolder 这样的真实路径?

【问题讨论】:

  • 你能说明如何使用 ACTION_OPEN_DOCUMENT_TREE 来让用户选择文件夹吗?

标签: android android-5.0-lollipop


【解决方案1】:

从 URI 中获取真实 Path 的过程和之前一样,只是有一点补充:

Uri uri = data.getData();
Uri docUri = DocumentsContract.buildDocumentUriUsingTree(uri, 
                        DocumentsContract.getTreeDocumentId(uri));
String path = getPath(this, docUri);

getPath() 方法和中间方法的要点可以在这里找到:getPath()

【讨论】:

  • 非常感谢,这正是我想要的。完美的 !如果你愿意,你也可以回答这个类似的问题,我会接受。 stackoverflow.com/questions/29775068/…
  • 它似乎不适用于 SD 卡路径。它是如何为你工作的?对我来说它崩溃了,因为它返回 null(但它确定它是一个外部存储类型)。
  • @androiddeveloper 你找到外置SD卡的解决方案了吗?我面临着类似的问题。无法获取外部 SD 卡中所选文件夹的真实路径。
  • @CoolGuy 哦。所以也许这会有所帮助:programcreek.com/java-api-examples/…。或者这个:stackoverflow.com/a/36162691/878126。搜索getFullPathFromTreeUri。公开并尝试一下。如果有效,请在此处发布答案。我不应该,因为我没有 SD 卡,所以我无法自己测试。
  • @androiddeveloper 非常感谢! Anonymous's answer 工作!这正是我所追求的
【解决方案2】:

无需查看安卓版本..

public static string GetRealPath(DocumentFile treeUri)
        {
            if (treeUri == null)
                return "";
            var path1 = treeUri.Uri.Path;
            if (path1.StartsWith("/tree/"))
            {
                var path2 = path1.Remove(0, "/tree/".Length);
                if (path2.StartsWith("primary:"))
                {
                    var primary = path2.Remove(0, "primary:".Length);
                    if (primary.Contains(':'))
                    {
                        
                        var storeName = "/storage/emulated/0/";
                        var last = path2.Split(':').LastOrDefault();
                        var realPath = storeName + last;
                        return realPath;
                    }
                }
                else
                {
                    if (path2.Contains(':'))
                    {
                        var path3 = path2.Split(':').FirstOrDefault();
                        var storeName = path3;
                        var last = path2.Split(':').LastOrDefault();
                        var realPath = "/" + storeName + "/" + last;
                        return realPath;
                    }
                }
            }
            return path1;
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-08
    • 2014-07-27
    • 2013-07-20
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多