1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > android从本地相册选择图片uri三星手机适配问题

android从本地相册选择图片uri三星手机适配问题

时间:2019-12-10 11:25:49

相关推荐

android从本地相册选择图片uri三星手机适配问题

转载地址:/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;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。