一、出现问题原因
针对不同手机调用系统拍照会出现拍照后图片自动旋转一定角度,针对开发中遇到的这些问题,特写本博客,望吐槽!
二、解决方案
1
针对以上问题,制定一下解决方案:
1、调取系统相册或拍照功能
/**
* actionSheetDialog不带标题
*/
private void actionSheetDialogNoTitle() {
new ActionSheetDialog(this)
.builder()
.setCancelable(true)
.setCanceledOnTouchOutside(false)
.addSheetItem("拍照", SheetItemColor.Blue,
newOnSheetItemClickListener() {
@Override
public voidonClick(int which) {
// 这里添加意图启动手机自带照相机
Log.d("meyki", "拍照");
Intentcameraintent = new Intent(
MediaStore.ACTION_IMAGE_CAPTURE);
// 指定调用相机拍照后照片的储存路径
cameraintent.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(tempFile));
startActivityForResult(cameraintent,
PHOTO_REQUEST_TAKEPHOTO);
}
})
.addSheetItem("从手机相册选择", SheetItemColor.Blue,
new OnSheetItemClickListener(){
@Override
public voidonClick(int which) {
Log.d("meyki", "从手机相册中选择");
Intent getAlbum= new Intent(
Intent.ACTION_PICK, Media.EXTERNAL_CONTENT_URI);
getAlbum.setType("image/*");
startActivityForResult(getAlbum,
PHOTO_REQUEST_GALLERY);
}
}).show();
}
2、调取系统相册中的照片或者刚拍照的照片进行裁剪操作
private void startPhotoZoom(Uri uri) {
1>获取调取照片的旋转角度
intdegree =UriPathUtils.readPictureDegree(uri.getPath());
获取图片旋转角度的具体方法
public static int readPictureDegree(String path) {
intdegree = 0;
try {
ExifInterface exifInterface = newExifInterface(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();
}
returndegree;
}
2>当旋转角度不为0时说明照片发生了旋转
if(Math.abs(degree) > 0){
try{
Bitmap mBitmap =MediaStore.Images.Media.getBitmap(this.getContentResolver(),uri);
3>根据照片旋转的角度,进行复位旋转,并保存图片的bitmap对象
Bitmap nBitmap = UriPathUtils.rotateBitmapByDegree(mBitmap,degree);
图片旋转的具体方法
public static Bitmap rotateBitmapByDegree(Bitmap bm,int degree) {
BitmapreturnBm = null;
// 根据旋转角度,生成旋转矩阵
Matrixmatrix = new Matrix();
matrix.postRotate(degree);
try {
// 将原始图片按照旋转矩阵进行旋转,并得到新的图片
returnBm = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(),matrix, true);
} catch(OutOfMemoryError e) {
}
if(returnBm == null) {
returnBm = bm;
}
if (bm!= returnBm) {
bm.recycle();
}
returnreturnBm;
}
UriPathUtils.saveBitmap(nBitmap,UriPathUtils.getFileByUri(this,uri));
}catch (IOException e){
e.printStackTrace();
}
}
4>调用系统照片裁剪功能
Intent intent= new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
// crop为true是设置在开启的intent中设置显示的view可以剪裁
intent.putExtra("crop", "true");
//aspectX aspectY 是宽高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
//outputX,outputY 是剪裁图片的宽高
intent.putExtra("outputX", 300);
intent.putExtra("outputY", 300);
intent.putExtra("return-data", true);
intent.putExtra("noFaceDetection", true);
intent.putExtra("uri", uri.getPath());
System.out.println("22================");
startActivityForResult(intent, PHOTO_REQUEST_CUT);
}
5>得到图片的的bitmap对象,并提交服务器
bitmap = data.getParcelableExtra("data");
if (bitmap == null) {
return;
}
uploadUserLogo(bitmap);