我想通过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);
答案 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
使用ContentResolver
和openInputStream()
获取InputStream
标识的内容Uri
。