三星、LG等部分手机调用相机拍照的模糊问题和拍照选取相册图片旋转问题

news/2024/11/20 10:35:08/

项目场景:

调用系统相机拍照、选择相册照片

问题描述:

部分手机(例如:三星、LG)调用系统相机拍照会模糊和旋转问题,选择的照片也会旋转问题
调用代码:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);startActivityForResult(intent,CAMERA_CODE);

onActivityResult里面从data里获取图片:data.getExtras().get(“data”)

原因分析:

模糊:在部分的三星等手机直接采用此Intent跳转方式,拍照后从data里获取的只是一个缩略图不是真实的原本的图片,要想获得真实的图片需要拍照时指定一个存储路径,将原图保存,然后onActivityResult里从路径里面取原图
旋转:拍照后旋转可能是手机的通过这种方式调用相机拍照设置的默认方向的原因,不管系统默认的是怎样的角度,通过ExifInterface获取图片信息就将旋转的角度再转回来即可,一般是顺时针旋转90度


解决方案:

模糊

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);if (intent.resolveActivity(getPackageManager()) != null) {File photoFile = null;try {photoFile = createImageFile();} catch (IOException e) {e.printStackTrace();}if (photoFile != null) {mCurrentPhotoUri = FileProvider.getUriForFile(OcrUpdateInfoActivity.this,getPackageName() + ".provider", photoFile);intent.putExtra(MediaStore.EXTRA_OUTPUT, mCurrentPhotoUri);intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {List<ResolveInfo> resInfoList = getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);for (ResolveInfo resolveInfo : resInfoList) {String packageName = resolveInfo.activityInfo.packageName;grantUriPermission(packageName, mCurrentPhotoUri,Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);}}startActivityForResult(intent, CAMERA_CODE);}}@SuppressWarnings("ResultOfMethodCallIgnored")private File createImageFile() throws IOException {// Create an image file nameString timeStamp =new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());String imageFileName = String.format("JPEG_%s.jpg", timeStamp);File storageDir;storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);if (!storageDir.exists()) storageDir.mkdirs();storageDir = new File(storageDir, "xxx");if (!storageDir.exists()) storageDir.mkdirs();// Avoid joining path components manuallyFile tempFile = new File(storageDir, imageFileName);// Handle the situation that user's external storage is not readyif (!Environment.MEDIA_MOUNTED.equals(EnvironmentCompat.getStorageState(tempFile))) {return null;}return tempFile;}

接下来onActivityResult里面不从data里获取图片,而是通过使用mCurrentPhotoUri 获取存放路径和bitmap

旋转

int degree = readPictureDegree(path);
if (degree != 0) {resultBitmap = rotaingImageView(degree, bitmap);
}/*** 读取照片旋转角度** @param path 照片路径* @return 角度*/public int readPictureDegree(String path) {int degree = 0;try {ExifInterface exifInterface = new ExifInterface(path);int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);switch (orientation) {case ExifInterface.ORIENTATION_ROTATE_90:degree = 90;break;case ExifInterface.ORIENTATION_ROTATE_180:degree = 180;break;case ExifInterface.ORIENTATION_ROTATE_270:degree = 270;break;}} catch (IOException e) {e.printStackTrace();}return degree;}/*** 旋转图片** @param angle  被旋转角度* @param bitmap 图片对象* @return 旋转后的图片*/public Bitmap rotaingImageView(int angle, Bitmap bitmap) {Bitmap returnBm = null;// 根据旋转角度,生成旋转矩阵Matrix matrix = new Matrix();matrix.postRotate(angle);try {// 将原始图片按照旋转矩阵进行旋转,并得到新的图片returnBm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);} catch (OutOfMemoryError e) {}if (returnBm == null) {returnBm = bitmap;}if (bitmap != returnBm) {bitmap.recycle();}return returnBm;}

根据ExifInterface 里的信息判断图片是否有旋转角度,不等于0就去将bitmap旋转就行了。


http://www.ppmy.cn/news/303512.html

相关文章

Android三星手机拍照自动旋转问题解决方案

Android 小米8SE&#xff0c;三星手机拍照&#xff0c;从图库选择照片旋转问题完美解决 目前测试机有个小米8SE&#xff0c;发现获取照片会有旋转的问题&#xff0c;之前有三星手机有这个问题&#xff0c;现在添加上小米8SE&#xff0c;小米8据说也有这个问题&#xff0c;但是…

三星等手机拍照选取图片,图片反转的问题

/** * 得到 图片旋转 的角度 * param filepath * return */ private int getExifOrientation(String filepath) { int degree 0; ExifInterface exif null; try { exif new ExifInterface(filepath); } catch (IOException ex) { Log.e("test", "cannot read…

android中用三星手机拍的照片读取后旋转了的解决、

三星手机通过拍照、打开相册获取的图片默认右旋了90度,这是因为三星拍照默认方向为横向,而一般拍照时均会竖着拿,这时图片就会旋转,并且会保存一个旋转角度,可以用 ExifInterface(包含相片相关信息)获取,根据这个角度旋转就能获得我们想要的方向。 demo: ExifInterface exif…

图集:红色款三星Galaxy S3智能手机上手体验

7月29日消息&#xff0c;美国AT&T此前宣布独家推出红色款三星Galaxy S3智能手机&#xff0c;美国时间7月15日启动预定&#xff0c;29日正式上市&#xff1b;两年合约价199.99美元。 款三星Galaxy S3配置4.8 英寸Super AMOLED屏幕&#xff0c;1.4GHz四核处理器&#xff0c;1…

解决三星手机拍照后,图片旋转。

<span style"font-size:18px;">最近项目中遇到用三星手机拍照&#xff0c;图片会自动旋转&#xff0c;应该是三星内部系统的功能&#xff0c;然后需要是不让他旋转&#xff0c;找到了方法。 原理就是&#xff0c;获取到图片&#xff0c;判断它的旋转角度&#…

解决三星手机拍照后裁剪图片时横屏问题

android:configChanges"orientation|keyboardHidden|navigation"

android解决三星手机拍照获取图片的问题

最近在项目中用到了拍照获取图片上传的功能。在其它的手机上测试功能正常&#xff0c;但是在我自己用的三星s3上面就出现了问题。这个问题困扰了我好几天。最后发现了一个问题&#xff0c;三星手机在拍照时默认是横屏的&#xff0c;我的应用默认是坚屏的&#xff0c;拍照完成后…

Android解决三星手机图片旋转问题

此文章只是记录自己在项目中遇到的问题&#xff0c;写下来&#xff0c;给自己提醒&#xff0c;相信接触过图片选择的必定会遇到三星手机从相册或者是拍照之后拿到图片路径&#xff0c;获取Bitmap对象&#xff0c;图片大了还得对bitmap进行压缩&#xff0c;最后显示在ImageView上…