Android 4.4以上获取图片URI格式不同导致getContentResolver返回null
来源:互联网 发布:蓝卡巡更软件 编辑:程序博客网 时间:2024/06/07 12:13
本文转自:http://www.jianshu.com/p/ae25718a1f05
Android 4.4以上获取图片URI格式不同导致getContentResolver返回null
今天在实现用户头像选择裁剪功能时,虚拟机裁剪没问题,实机却调用不了系统的裁剪,百度了一下以为是网上说的miui的裁剪的图片过大,或对return data分配的资源不够,可是我这连裁剪Activity都没有启动,所以可能性不大,试着Log输出一下,果然是因为getContentResolver()没有获得数据,这种情况大多都是Android系统版本问题,所以我又试着打印了uri的字符串,果然不同版本通过intent.setAction(Intent.ACTION_PICK); intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
返回的uri格式不同
Android4.4以前获取的uri的字符串是“content://media/external/image/media”
格式的,而4.4以后变成"file:///sdcard/mysong.mp3"
格式,会导致Cursor c = getContentResolver().query(uri,MediaStore.Images.Media.DATA, null, null, null);
获取的c里面并没有图片信息。而裁剪图片所需要获取图片的真实路径path可以使用由android_Y网友提供的根据Uri获取图片绝对路径,解决Android4.4以上版本Uri转换
* 根据Uri获取图片绝对路径,解决Android4.4以上版本Uri转换 * @param activity * @param imageUri * @author yaoxing * @date 2014-10-12 */ @TargetApi(19) public static String getImageAbsolutePath(Activity context, Uri imageUri) { if (context == null || imageUri == null) return null; if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT &&Uri(context, imageUri)) { if (isExternalStorageDocument(imageUri)) { String docId = DocumentsContract.getDocumentId(imageUri); String[] split = docId.split(":"); String type = split[0]; if ("primary".equalsIgnoreCase(type)) { return Environment.getExternalStorageDirectory() + "/" + split[1]; } } else if (isDownloadsDocument(imageUri)) { String id = DocumentsContract.getDocumentId(imageUri); Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); return getDataColumn(context, contentUri, null, null); } else if (isMediaDocument(imageUri)) { String docId = DocumentsContract.getDocumentId(imageUri); String[] split = docId.split(":"); String type = split[0]; Uri contentUri = null; if ("image".equals(type)) { contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; } else if ("video".equals(type)) { contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; } else if ("audio".equals(type)) { contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; } String selection = MediaStore.Images.Media._ID + "=?"; String[] selectionArgs = new String[] { split[1] }; return getDataColumn(context, contentUri, selection, selectionArgs); } } // MediaStore (and general) else if ("content".equalsIgnoreCase(imageUri.getScheme())) { // Return the remote address if (isGooglePhotosUri(imageUri)) return imageUri.getLastPathSegment(); return getDataColumn(context, imageUri, null, null); } // File else if ("file".equalsIgnoreCase(imageUri.getScheme())) { return imageUri.getPath(); } return null; } public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) { Cursor cursor = null; String column = MediaStore.Images.Media.DATA; String[] projection = { column }; try { cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null); if (cursor != null && cursor.moveToFirst()) { int index = cursor.getColumnIndexOrThrow(column); return cursor.getString(index); } } finally { if (cursor != null) cursor.close(); } return null; } /** * @param uri The Uri to check. * @return Whether the Uri authority is ExternalStorageProvider. */ public static boolean isExternalStorageDocument(Uri uri) { return "com.android.externalstorage.documents".equals(uri.getAuthority()); } /** * @param uri The Uri to check. * @return Whether the Uri authority is DownloadsProvider. */ public static boolean isDownloadsDocument(Uri uri) { return "com.android.providers.downloads.documents".equals(uri.getAuthority()); } /** * @param uri The Uri to check. * @return Whether the Uri authority is MediaProvider. */ public static boolean isMediaDocument(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. */ public static boolean isGooglePhotosUri(Uri uri) { return "com.google.android.apps.photos.content".equals(uri.getAuthority()); }
0 0
- Android 4.4以上获取图片URI格式不同导致getContentResolver返回null
- android 4.4版本以上系统相册图片返回URI的不同处理
- 解决从相册获取图片路径cursor = getContentResolver().query(uri, proj, null, null, null)报空的问题
- android 取相册 图片 getContentResolver().query 返回空。
- Android 4.4以上 根据uri获取路径的方法
- Android 4.4从图库选择图片并裁剪,由于系统版本不同导致Uri的bug的简单解决方式
- Android 4.4从图库选择图片并裁剪,由于系统版本不同导致Uri的bug的几种解决方案
- 图库获取图片ACTION_PICK 不同系统返回Uri不一致问题(file_path或content)
- Android 4.2.2以上获取本地图片的Uri问题处理
- android获取网络图片的用法 BitmapFactory.decodeByteArray 返回null
- Android获取图片Uri/path
- android4.4以上版本获取图片的uri
- Android 根据URI获取图片(从相册选择图片后返回)
- Android 设置铃声,getContentResolver().insert returns null
- Android 设置铃声,getContentResolver().insert returns null
- Android在选择系统相册图片时,返回的图片地址不同导致程序崩溃!!!
- Android根据图片Uri获取图片绝对路径
- Android根据图片Uri获取图片绝对路径
- android 版本更新的应用
- UITableView优化技巧4
- Genymotion移动虚拟机
- OpenCV移植到Android移动端
- Android 异步任务AsyncTask
- Android 4.4以上获取图片URI格式不同导致getContentResolver返回null
- UITableView优化技巧5
- generate Parentheses----leetcode
- oracle 11g SQL profile惹的祸
- 【三星官方教程】如何为Gear VR开发应用(四):场景连接
- C语言课设--电影院售票
- NYOJ14——贪心
- 将SQLite中的数据转换为Excel表
- 防止手机短信诈骗你能轻松应对吗