Android Camera在Redmi Note5设备拍照图像旋转异常问题求助
解决Redmi Note5上Android Camera拍照旋转无效的问题
我之前也踩过Redmi系列设备的Camera旋转坑,太懂这种代码在大部分机器上正常,唯独某台设备罢工的郁闷了!你遇到的setRotation()无效问题,本质是部分小米/红米机型对Camera参数的处理逻辑和其他设备不一样——setRotation()其实只是给图片添加旋转元数据(Exif信息),而不是直接修改像素方向,有些系统或自定义的图片加载逻辑会忽略这个元数据,导致显示还是歪的。
具体解决方案分三步走:
1. 计算正确的旋转角度(结合屏幕方向和相机传感器方向)
别硬写90/270这类固定值,根据当前屏幕旋转和相机硬件的默认方向动态计算才靠谱:
// 获取屏幕当前旋转角度 int rotation = getWindowManager().getDefaultDisplay().getRotation(); int degrees = 0; switch (rotation) { case Surface.ROTATION_0: degrees = 0; break; case Surface.ROTATION_90: degrees = 90; break; case Surface.ROTATION_180: degrees = 180; break; case Surface.ROTATION_270: degrees = 270; break; } // 获取相机传感器的默认方向(区分前置/后置) Camera.CameraInfo info = new Camera.CameraInfo(); Camera.getCameraInfo(cameraId, info); // cameraId是0(后置)或1(前置) int correctRotation; if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { // 前置摄像头需要镜像翻转,角度要特殊处理 correctRotation = (info.orientation + degrees) % 360; correctRotation = (360 - correctRotation) % 360; } else { // 后置摄像头直接计算补偿角度 correctRotation = (info.orientation - degrees + 360) % 360; }
2. 同步设置相机参数和预览方向
光设置setRotation()不够,还要同步调整预览的显示方向,确保预览和最终拍照方向一致:
Camera.Parameters params = mCamera.getParameters(); params.setRotation(correctRotation); // 写入Exif元数据 mCamera.setParameters(params); // 设置预览的显示方向,避免预览画面本身就是歪的 mCamera.setDisplayOrientation(correctRotation);
3. 拍照后手动旋转图片像素(关键!)
Redmi Note5大概率会忽略Exif元数据,所以在拍照回调里必须主动旋转图片的像素:
mCamera.takePicture(null, null, new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { // 把字节数组转成Bitmap Bitmap originalBitmap = BitmapFactory.decodeByteArray(data, 0, data.length); // 创建旋转矩阵 Matrix matrix = new Matrix(); matrix.postRotate(correctRotation); // 生成旋转后的Bitmap Bitmap rotatedBitmap = Bitmap.createBitmap(originalBitmap, 0, 0, originalBitmap.getWidth(), originalBitmap.getHeight(), matrix, true); // 接下来就可以保存rotatedBitmap或者用于显示了 // ... } });
额外提示:
如果保存图片时希望系统相册也能正确识别方向,可以在保存rotatedBitmap后,手动写入Exif的旋转标记,进一步提升兼容性。
按照这个流程操作,Redmi Note5上的拍照旋转问题应该就能彻底解决了,我当初就是这么搞定的!
内容的提问来源于stack exchange,提问作者Ashutosh Chamoli




