InputStream is = getActivity().getContentResolver().openInputStream(uri);
上面代码可以打开1和2格式的Uri,3格式的Uri打开会抛异常:
java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaDocumentsProvider uri content://com.android.providers.media.documents/document/image:75343 from pid=24763, uid=10209 requires android.permission.MANAGE_DOCUMENTS, or grantUriPermission()
Uri获取
if (Build.VERSION.SDK_INT < SystemInfo.ANDROID_VERSION_CODE.KITKAT){ intent = new Intent(); intent.setAction(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); getActivity().startActivityForResult(intent, REQ_PHOTO); } else { intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("image/*"); getActivity().startActivityForResult(intent, REQ_PHOTO_KITKAT); }
// DocumentProvider if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { // ExternalStorageProvider if (isExternalStorageDocument(uri)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0];
if ("primary".equalsIgnoreCase(type)) { return Environment.getExternalStorageDirectory() + "/" + split[1]; }
final String id = DocumentsContract.getDocumentId(uri); final Uri contentUri = ContentUris.withAppendedId( Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
return getDataColumn(context, contentUri, null, null); } // MediaProvider elseif (isMediaDocument(uri)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0];
/** * Get the value of the data column for this Uri. This is useful for * MediaStore Uris, and other file-based ContentProviders. * * @param context The context. * @param uri The Uri to query. * @param selection (Optional) Filter used in the query. * @param selectionArgs (Optional) Selection arguments used in the query. * @return The value of the _data column, which is typically a file path. */ publicstatic String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs){
Cursor cursor = null; final String column = "_data"; final String[] projection = { column };
/** * @param uri The Uri to check. * @return Whether the Uri authority is ExternalStorageProvider. */ publicstaticbooleanisExternalStorageDocument(Uri uri){ return"com.android.externalstorage.documents".equals(uri.getAuthority()); }
/** * @param uri The Uri to check. * @return Whether the Uri authority is DownloadsProvider. */ publicstaticbooleanisDownloadsDocument(Uri uri){ return"com.android.providers.downloads.documents".equals(uri.getAuthority()); }
/** * @param uri The Uri to check. * @return Whether the Uri authority is MediaProvider. */ publicstaticbooleanisMediaDocument(Uri uri){ return"com.android.providers.media.documents".equals(uri.getAuthority()); }
/** * @param uri The Uri to check. * @return Whether the Uri authority is Google Photos. */ publicstaticbooleanisGooglePhotosUri(Uri uri){ return"com.google.android.apps.photos.content".equals(uri.getAuthority()); }
4.4中新增特性:Storage Access Framework 作用目的:The SAF makes it simple for users to browse and open documents, images, and other files across all of their their preferred document storage providers. A standard, easy-to-use UI lets users browse files and access recents in a consistent way across apps and providers