【问题标题】:Get directory path from content URI从内容 URI 获取目录路径
【发布时间】:2015-10-07 13:26:36
【问题描述】:

我正在使用 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,那太可怕了。

【问题讨论】:

    标签: java android uri


    【解决方案1】:

    现在,我需要获取绝对路径,在这种情况下转换为 /storage/sdcard1/Images。

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

    使用ContentResolver 和openInputStream() 在内容上获得InputStream 并以这种方式阅读。这与您处理 Web 服务器 URL 的方式没有太大区别(使用 HttpUrlConnection 在网页或其他内容上获取 InputStream)。

    但是如何将这个呈现给用户呢?

    我不知道“这个”是什么。但是,you can get the suggested display name associated with the content。

    【讨论】:

    • OpenableColumns.DISPLAY_NAME 是一个开始,但正如我所提到的,“this”是一个文件夹。假设用户选择了一个“图像”文件夹。它是SD卡上的那个吗?是内存里面的那个吗?仅获取名称(这是 OpenableColumns.DISPLAY_NAME 包含的文件夹名称)是不够的。
    • @Kernald:然后让用户将他们自己的标签与他们的选择相关联,就在做出选择之前或之后,而不是假设用户会理解文件系统路径,即使你能得到一个.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 2014-07-31
    • 2012-08-15
    • 2018-07-05
    • 1970-01-01
    • 2023-01-12
    • 2020-06-10
    相关资源
    最近更新 更多