You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动