从内容URI获取目录路径

4

我正在使用SDK的ACTION_OPEN_DOCUMENT_TREE意图,让用户选择目录。以下是代码:

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。这是一个示例输出: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,那只会让人感到恐惧。

1个回答

2
现在,我需要获取绝对路径,例如在这种情况下是 /storage/sdcard1/Images。
这是不可能的。没有要求Uri指向一个文件,更不用说你可以访问的文件了。
使用ContentResolver和openInputStream()来获取内容上的InputStream并以这种方式读取它。这与处理指向Web服务器的URL(使用HttpUrlConnection获取Web页面或其他内容的InputStream)没有太大区别。
但如何向用户展示这个呢?
我不知道“这”是什么。但是,您可以获取与内容关联的建议显示名称。

OpenableColumns.DISPLAY_NAME 是一个开始,但正如我所提到的,“this”是一个文件夹。假设用户选择了一个“images”文件夹。它是在SD卡上的那个吗?还是在内部存储器上的那个?仅仅获取名称(这就是文件夹包含的 OpenableColumns.DISPLAY_NAME)是不够的。 - Marc Plano-Lesay
@Kernald:那么让用户在选择之前或之后将自己的标签与其关联,而不是假设用户会理解文件系统路径,即使您可以获得一个。 - CommonsWare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接