如何通过uri获取文件路径哪个权限是" com.android.externalstorage.documents"

时间:2017-05-28 09:59:42

标签: android

我想通过openActivityForResult选择打开文件来获取文件路径,其意图是Intent.ACTION_GET_CONTENT和setType(* / *),但是当我选择打开表单时," Nexus 5X" item返回uri是" com.android.externalstorage.documents",如何处理这种类型的uri。 有一些代码。

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.putExtra(Intent.ACTION_DEVICE_STORAGE_OK, true);
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
intent.setType("*/*");
startActivityForResult(intent, FILE_ADD_ACTION_REQUEST_CODE);

screenshot

2 个答案:

答案 0 :(得分:1)

外部存储URI具有以下形式:

content://com.android.externalstorage.documents/root%3Apath

其中root是存储介质的根,%3A只是一个转义冒号,而path是相对于根的文件系统路径(也是转义)。

在具有模拟主存储的设备(即现代Android设备)上,主存储的根(即/sdcard)通常称为primary。在其他情况下,它似乎是媒体ID(用连字符分隔的4 + 4个十六进制数字)。

您也可以尝试使用此功能(完整功能需要API 21):

 public static String getRealPathFromURI_API19(Context context, Uri uri) {
    String filePath = "";

    // ExternalStorageProvider
    String docId = DocumentsContract.getDocumentId(uri);
    String[] split = docId.split(':');
    String type = split[0];

    if ("primary".equalsIgnoreCase(type)) {
        return Environment.getExternalStorageDirectory() + "/" + split[1];
    } else {
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {
            //getExternalMediaDirs() added in API 21
            File[] external = context.getExternalMediaDirs();
            if (external.length > 1) {
                filePath = external[1].getAbsolutePath();
                filePath = filePath.substring(0, filePath.indexOf("Android")) + split[1];
            }
        } else {
            filePath = "/storage/" + type + "/" + split[1];
        }
        return filePath;
}

答案 1 :(得分:0)

  

如何处理这种类型的uri

使用ContentResolveropenInputStream()获取InputStream标识的内容Uri