在使用usb camera的时候,想在系统设置里面增加一个开关,控制camera的水平镜像、垂直镜像、旋转等,希望在framework层来做而不是在应用层,找了很多资料也问了gpt,最终发现是在frameworks\av\services\camera\libcameraservice\api1\CameraClient.cpp中修改getOrientation函数,修改代码如下:
int CameraClient::getOrientation(int degrees, bool mirror) {
// if (!mirror) {
// if (degrees == 0) return 0;
// else if (degrees == 90) return HAL_TRANSFORM_ROT_90;
// else if (degrees == 180) return HAL_TRANSFORM_ROT_180;
// else if (degrees == 270) return HAL_TRANSFORM_ROT_270;
// } else { // Do mirror (horizontal flip)
// if (degrees == 0) { // FLIP_H and ROT_0
// return HAL_TRANSFORM_FLIP_H;
// } else if (degrees == 90) { // FLIP_H and ROT_90
// return HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_ROT_90;
// } else if (degrees == 180) { // FLIP_H and ROT_180
// return HAL_TRANSFORM_FLIP_V;
// } else if (degrees == 270) { // FLIP_H and ROT_270
// return HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90;
// }
// }
char orientation[PROPERTY_VALUE_MAX];
// 获取usb摄像头旋转配置属性
property_get("persist.usbcamera.orientation", orientation, "");
ALOGE("lzq777 -> persist.usbcamera.orientation=%s,", orientation);
if (strcmp(orientation, "90") == 0) {
degrees = degrees + 90;
}else if (strcmp(orientation, "180") == 0) {
degrees = degrees + 180;
}else if (strcmp(orientation, "270") == 0) {
degrees = degrees + 180;
}
if (degrees >= 360) {
degrees = degrees - 360;
}
char flip[PROPERTY_VALUE_MAX];
// 获取usb摄像头镜像配置属性
property_get("persist.usbcamera.flip", flip, "");
ALOGE("lzq777 -> persist.usbcamera.flip=%s,", flip);
// 不进行镜像
if (strcmp(flip, "0") == 0) {
if (degrees == 0) return 0;
else if (degrees == 90) return HAL_TRANSFORM_ROT_90;
else if (degrees == 180) return HAL_TRANSFORM_ROT_180;
else if (degrees == 270) return HAL_TRANSFORM_ROT_270;
}
// 水平镜像翻转
else if (strcmp(flip, "1") == 0){
if (degrees == 0) { // FLIP_H and ROT_0
return HAL_TRANSFORM_FLIP_H;
} else if (degrees == 90) { // FLIP_H and ROT_90
return HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_ROT_90;
} else if (degrees == 180) { // FLIP_H and ROT_180
return HAL_TRANSFORM_FLIP_V;
} else if (degrees == 270) { // FLIP_H and ROT_270
return HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90;
}
}
// 垂直镜像翻转
else if (strcmp(flip, "2") == 0){
if (degrees == 0) { // FLIP_H and ROT_0
return HAL_TRANSFORM_FLIP_V;
} else if (degrees == 90) { // FLIP_H and ROT_90
return HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90;
} else if (degrees == 180) { // FLIP_H and ROT_180
return HAL_TRANSFORM_FLIP_H;
} else if (degrees == 270) { // FLIP_H and ROT_270
return HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_ROT_90;
}
}
ALOGE("Invalid setDisplayOrientation degrees=%d", degrees);
return -1;
}
以上属性配置可自行配置到system.prop当中,然后在settings里面修改属性即可