我使用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
,这只是可怕的。
答案 0 :(得分:1)
现在,我需要获得绝对路径,在这种情况下将其转换为/ storage / sdcard1 / Images。
这是不可能的。不要求Uri
指向文件,更不用说您可以访问的文件了。
使用ContentResolver
和openInputStream()
获取内容的InputStream
并以此方式阅读。这与处理Web服务器的URL的方式没有显着差异(使用HttpUrlConnection
在网页或其他内容上获取InputStream
。
但是如何向用户展示呢?
我不知道"这个"是。但是,you can get the suggested display name associated with the content。