转载地址:http://blog.csdn.net/CathyChen0910/article/details/62456438
启动系统相册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/"); 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; }