从内容 URI 获取目录路径

Get directory path from content URI

我正在使用 SDK 的 ACTION_OPEN_DOCUMENT_TREE 意图让用户 select 一个目录。这是代码:

private static final int REQUEST_PICK_FOLDER = 1;

// …

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_add_folder: {
            Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
            startActivityForResult(intent, REQUEST_PICK_FOLDER);
            return true;

        default:
            return super.onOptionsItemSelected(item);
    }
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_PICK_FOLDER && resultCode == Activity.RESULT_OK) {
        addFolder(data.getData());
    }
}

private void addFolder(Uri uri) {
    Uri docUri = DocumentsContract.buildDocumentUriUsingTree(uri, DocumentsContract.getTreeDocumentId(uri));
    Log.d(TAG, "Folder added: " + docUri.toString());
}

我有一个 URI(可能)指向我刚刚 selected 的文件夹。这是一个示例输出:Folder added: content://com.android.externalstorage.documents/tree/FF30-E80D%3AImages/document/FF30-E80D%3AImages.

现在,我需要获取绝对路径,在本例中翻译为 /storage/sdcard1/Images。我在 aFileChooser 中发现了一些代码似乎可以工作,但不适用于 SD 卡,这是我的主要用例。

我大概可以在%3A上拆分URI,如果前面部分是"primary",那么就用第一个外部存储路径,如果是别的就用第二个,不过感觉错了……可能有更确定的方法来实现这个?

编辑:这里有一些背景知识。我不需要管理文件的路径。但是如何将其呈现给用户呢?绝对不能给他看content://com.android.externalstorage.documents/tree/FF30-E80D%3AImages/document/FF30-E80D%3AImages,太可怕了

Now, I need to get the absolute path, something translating in this case to /storage/sdcard1/Images.

那是不可能的。 Uri 根本不需要指向文件,更不用说您可以访问的文件了。

使用 ContentResolveropenInputStream() 在内容上获得 InputStream 并以这种方式阅读。这与您处理 URL 到 Web 服务器的方式没有明显不同(使用 HttpUrlConnection 在网页或其他内容上获取 InputStream)。

But how to present this to the user?

我不知道 "this" 是什么。然而,you can get the suggested display name associated with the content