安卓手机调用系统的相机拍照之后,本来应该是根据你手机的拍照方向,预览照片应该是根据你手持手机的方向不一样而不一样。但是现在就有一个问题,华为手机是正常的,但是像Vivo和小米手机跳用系统的相机拍照之后,显示的预览图是横屏的。
首先试着解决Activity的显示方式只能是竖屏:
android:screenOrientation="portrait"
发现加上之后华为是可以正常显示的,但是小米和vivo手机还是不行。
Android 设置禁止横屏失效解决方法
加上代码申请竖屏之后,解决了vivo手机的问题,可以正常显示。但是小米系列手机不行!
后来发现小米手机的拍照之后,图片默认是横向显示的,也就是手机其实还是正常的竖屏,但是照片被旋转了90度显示。
下面是小米的适配代码:
hideTakePhotoLayout();
BitmapFactory.Options options = new BitmapFactory.Options();
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length,options);
//在这里判断显示图片的旋转角度,然后正确旋转之后显示
Matrix matrix = new Matrix();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//compress方法是把一个位图写到一个OutputStream中,参数一是位图对象,二是格式,三是压缩的质量,四是输出流
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
//输出流转成输入流
InputStream inputimage = new ByteArrayInputStream(baos.toByteArray());
matrix.postRotate(getPhotoRotation(inputimage));
Log.e(">>>>>>>>>>>>>","getPhotoRotation(inputimage):"+getPhotoRotation(inputimage));
if ("xiaomi".equalsIgnoreCase(Build.MANUFACTURER)) {
matrix.postRotate(90); //小米手机需要旋转90度正常显示
}
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
vShowPhoto.setImageBitmap(bitmap);
bases64 = EncryptHelper.getBase64(bytes);
if (vloadingLay != null)
vloadingLay.setVisibility(View.VISIBLE);
if(vloading != null)
vloading.setText("翻译中...");
startTranslate(bases64);
需要获取图片旋转的角度的方法:
private int getPhotoRotation(InputStream inputStream){
try{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
ExifInterface exifInterface = new ExifInterface(inputStream);
int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
switch (orientation){
case ExifInterface.ORIENTATION_ROTATE_90:
return 90;
case ExifInterface.ORIENTATION_ROTATE_180:
return 180;
case ExifInterface.ORIENTATION_ROTATE_270:
return 270;
default:
return 0;
}
}
}catch (Exception e){
Log.e(">>>>>>>>>>>>","获取图片旋转的角度报错:"+e.getMessage());
}
return 0;
}
但是这个代码还是根据了手机的不同型号进行了适配。
解决方案二:
把手机的拍照的方向全部设置成横屏,那么拍的照片也就是横屏的照片。