(1)正常安装摄像头的规则
(A)显示屏LCD有两种刷新方向,沿短边扫描(竖屏)和沿长边扫描(横屏)
(B)摄像头安装角度需要满足长边对长边,短边对短边(这里的长边对长边表示:摄像头长边对齐LCD屏的长边)
(C)摄像头成像的小人头方向是垂直于摄像头长边方向,由B可知,小人头方向也是垂直于LCD屏长边
(2)摄像头成像的小人头方向
(A)竖屏手机:摄像头的安装角度需要配置成90(后摄)和270(前摄),使图像顺时针旋转从而得到正确的预览
(B)横屏手机:摄像头的安装角度需要配置成0(后摄)和180(前摄),使图像顺时针旋转从而得到正确的预览
(3)LCD屏的刷新方向影响上层的Rotation
//Display.java
public int getRotation() {
synchronized (this) {
updateDisplayInfoLocked();
return mMayAdjustByFixedRotation
? getDisplayAdjustments().getRotation(mDisplayInfo.rotation)
: mDisplayInfo.rotation;
}
}
int rotation = mActivity.getWindowManager().getDefaultDisplay().getRotation();//获取屏幕旋转的方向
竖屏手机:竖屏方向getRotation返回0,顺时针旋转递增(0,1,2,3)
横屏手机:横屏方向getRotation返回0,顺时针旋转递增(0,1,2,3)
备注:横屏手机会导致三方Camera应用(固定竖屏应用)的预览方向不正确,因为三方Camera应用只适配了竖屏情况,无法适配横屏情况,从而导致预览方向不正确。横屏/横竖屏应用可以正常显示。
(4)横屏手机如何兼容竖屏三方Camera应用
思路:将横屏手机竖用设置,从而达到横屏竖用的目的,主要修改以下两处。(补救措施)
(A)修改Display方向
//Display.java
public int getRotation() {
synchronized (this) {
updateDisplayInfoLocked();
Log.d("Display","getRotation: " + (mMayAdjustByFixedRotation
? getDisplayAdjustments().getRotation(mDisplayInfo.rotation)
: mDisplayInfo.rotation));
//add start
//3-->0 , 0-->1
if (SystemProperties.getBoolean("ro.rotation.display", false)) {
int mRotation = (mMayAdjustByFixedRotation
? getDisplayAdjustments().getRotation(mDisplayInfo.rotation)
: mDisplayInfo.rotation);
return (mRotation + 1 ) % 4;
}
//add end
return mMayAdjustByFixedRotation
? getDisplayAdjustments().getRotation(mDisplayInfo.rotation)
: mDisplayInfo.rotation;
}
}
(B)对调gsensor的xy值
//SystemSensorManager.java
protected void dispatchSensorEvent(int handle, float[] values, int inAccuracy,
long timestamp) {
final Sensor sensor = mManager.mHandleToSensor.get(handle);
if (sensor == null) {
// sensor disconnected
return;
}
//add start
if (SystemProperties.getBoolean("ro.rotation.display", false)) {
if(!ActivityThread.currentOpPackageName().contains("android") //排除系统应用,系统应用兼容横竖屏
|| (ActivityThread.currentOpPackageName().contains("jp.naver.line.android"))){ //添加部分三方应用,部分三方应用包名包含android
if(sensor.getType() == Sensor.TYPE_ACCELEROMETER ){
Log.d("wdd111_SensorEventQueue","x = " + values[0] + ",y = " + values[1] + ",z = " + values[2]);
if (sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
float tmp;
tmp = values[0];
values[0] = values[1];
values[1] = -tmp;
}
}
}
}
//add end
SensorEvent t = null;
synchronized (mSensorsEvents) {
t = mSensorsEvents.get(handle);
}
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/dongxianfei/article/details/121272869