android从本地相册选择图片uri三星手机适配问题
2017-12-13 13:04
495 查看
转载地址:http://blog.csdn.net/CathyChen0910/article/details/62456438
启动系统相册intent
正常的手机拿到的uri是这样的:
启动系统相册intent
Intent intentFromGallery = new Intent(); if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {//4.4及以上 intentFromGallery.setAction(Intent.ACTION_PICK); } else {//4.4以下 intentFromGallery.setAction(Intent.ACTION_GET_CONTENT); } intentFromGallery.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); startActivityForResult(intentFromGallery, IMAGE_REQUEST_CODE);
从系统相册中任意选择一张图片以后回调onActivityResult()
protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode != RESULT_CANCELED) { switch (requestCode) { case IMAGE_REQUEST_CODE://从相册返回的 Uri originalUri = data.getData(); try { //为防止原始图片过大导致内存溢出,这里先缩小原图显示,然后释放原始Bitmap占用的内存 Bitmap photo = BitmapUtils.getAngleBitmap(this, originalUri); setImageAndCameraResult(photo); } catch (Exception e) { e.printStackTrace(); } break; } } }
正常的手机拿到的uri是这样的:
content://media/external/images/media/2246
但是三星手机拿到的uri是这样的:
contentprovider/-1/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F1201/ACTUAL/1023354366
正因为如此会导致contentprovider查找不到,所以会出现异常:
Cursor cursor = cr.query(newUri, null, null, null, null);// 根据Uri从数据库中找
以上方法拿不到正确的cursor,导致
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
拿不到正确的值,以至于无法获取到正确的图片
解决方法如下所示:重新组装一次uri的值,使得其转换成正确的可以使用的uri,具体方法就是下面代码中//从stackoverflow上抄来的方案,测试通过
/** * 拍照或选择相册照片之后调整照片的角度 * * @param mImageCaptureUri * @return 调整之后的照片 */ public static Bitmap getAngleBitmap(Context appContext, Uri mImageCaptureUri) { //从stackoverflow上抄来的 Uri newUri; if(mImageCaptureUri.toString().contains("%")){ String unusablePath = mImageCaptureUri.getPath(); int startIndex = unusablePath.indexOf("external/"); 4000 int endIndex = unusablePath.indexOf("/ACTUAL"); String embeddedPath = unusablePath.substring(startIndex, endIndex); Uri.Builder builder = mImageCaptureUri.buildUpon(); builder.path(embeddedPath); builder.authority("media"); newUri = builder.build(); }else { newUri = mImageCaptureUri; } // 不管是拍照还是选择图片每张图片都有在数据中存储也存储有对应旋转角度orientation值 // 所以我们在取出图片是把角度值取出以便能正确的显示图片,没有旋转时的效果观看 ContentResolver cr = appContext.getApplicationContext().getContentResolver(); Cursor cursor = cr.query(newUri, null, null, null, null);// 根据Uri从数据库中找 if (cursor != null) { int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst();// 把游标移动到首位,因为这里的Uri是包含ID的所以是唯一的不需要循环找指向第一个就是了 String filePath = cursor.getString(column_index);// 获取图片路 String orientation = cursor.getString(cursor .getColumnIndex("orientation"));// 获取旋转的角度 cursor.close(); if (filePath != null) { Bitmap bitmap = getResizedImage(filePath, 500);// 根据Path读取资源图片 int angle = 0; if (orientation != null && !"".equals(orientation)) { angle = Integer.parseInt(orientation); } if (angle != 0) { // 下面的方法主要作用是把图片转一个角度,也可以放大缩小等 Matrix m = new Matrix(); int width = bitmap.getWidth(); int height = bitmap.getHeight(); m.setRotate(angle); // 旋转angle度 bitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, m, true);// 从新生成图片 } return bitmap; } } return null; }
相关文章推荐
- android从本地相册获取图片uri三星手机适配问题
- android选择本地相册图片路径的问题的解决
- <android>头像上传,打开相册 —— 图片压缩——上传成功 (附三星手机适配图片旋转问题)
- android选择系统相机拍照和系统相册,裁剪图片并保存和设置头像,适配至7.0
- Android实现拍照,以及从相册选择图片裁剪功能同时保存在本地
- Android - Android 7.0 拍照,相册选择和系统图片裁剪和删除适配
- Android调用本地相册选择图片并剪切后展示和缓存
- Uri android 选择图片或拍照时旋转了90度问题
- Android 机型适配-图片或者视频保存到相册立即显示问题
- Android 调用系统相机拍照(适配7.0)、从图库选择图片、从数据库读取联系人信息、相册图片、扫描文件
- android本地图片选择(相册选取,相机拍摄)
- Android 图片选择对话框,通过本地相册或照相机获得图片,可单选或多选,单选可设置是否裁剪
- Cocos2d-x 3.x 头像选择,本地相册图片+图片编辑(Android、IOS双平台)
- android选择本地相册或拍照更换软件背景图片
- Android 多媒体应用:从相册选择照片显示(解决相册中图片显示不出来的问题)
- Android基础--调用系统相机,打开相册,展示到界面,出现的一些问题Uri为空,data为null,图片错乱问题
- 一次性带你解决android 7.0之前所有相册选择图片问题
- android 开启本地相册选择图片并返回显示
- Android-->拍照/相册选择照片(从Uri中获取图片路径)
- android 客户端通过选择本地相册和拍照上传本地图片到服务器端