从内容URI获取目录路径

我正在使用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,如果前面的部分是“主要的”,那么使用第一个外部存储路径,如果它是别的,使用第二个,但感觉不对……可能有更确定的方法来实现这个?

编辑:这里有一些背景知识。 我不需要管理文件的路径。 但是如何向用户呈现这个? 我绝对无法向他展示content://com.android.externalstorage.documents/tree/FF30-E80D%3AImages/document/FF30-E80D%3AImages ,这简直太吓人了。

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

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

使用ContentResolveropenInputStream()在内容上获取InputStream并以这种方式读取它。 这与处理Web服务器的URL的方式没有显着差异(使用HttpUrlConnection在Web页面或其他内容上获取InputStream )。

但是如何向用户呈现这个?

我不知道“这个”是什么。 但是, 您可以获取与内容关联的建议显示名称 。