Android5.1.1 自带Camera2/SnapdragonCamera的apk拍照方向旋转90°

本文详细解析了相机拍照方向错乱的原因及解决方法,通过分析Camera2/src/com/android/camera/PhotoModule.java代码,指出了问题根源在于缺少重力感应器导致的方向传感器数据无法更新,并给出了具体的代码修改建议。

实际上这个原因是因为机器里没有重力感应器造成的。
根据Camera2/src/com/android/camera/PhotoModule.java 的代码查看原因。

160     // The degrees of the device rotated clockwise from its natural orientation.
<span style="white-space:pre">	</span>// 设备的角度旋转按顺时针旋转的自然方向
161     private int mOrientation = OrientationEventListener.ORIENTATION_UNKNOWN;   

………………

1298         // Set JPEG orientation. Even if screen UI is locked in portrait, camera orientation should
1299         // still match device orientation (e.g., users should always get landscape photos while
1300         // capturing by putting device in landscape.)
1301         int orientation = mActivity.isAutoRotateScreen() ? mDisplayRotation : mOrientation;//是否自动旋转的屏幕?                                                                                 
1302         Characteristics info = mActivity.getCameraProvider().getCharacteristics(mCameraId);
1303         mJpegRotation = info.getJpegOrientation(orientation);//利用orientation获得Jpeg的方向
1304         mCameraDevice.setJpegOrientation(mJpegRotation);//设置输出的Jpeg方向

可以得知这里是和设置角度有关的,可是查找全篇得知mOrientation只在如下代码片段修改

1347     @Override
1348     public void onOrientationChanged(int orientation) {
1349         if (orientation == OrientationEventListener.ORIENTATION_UNKNOWN) {            
1350             return;
1351         }
1352 
1353         // TODO: Document orientation compute logic and unify them in OrientationManagerImpl.
1354         // b/17443789
1355         // Flip to counter-clockwise orientation.
1356         mOrientation = (360 - orientation) % 360;
1357     }
这个函数在由方向传感器发生变化后才触发,实际上是由PhotoModule继承的接口SensorEventListener有关。

 101 public class PhotoModule
 102         extends CameraModule
 103         implements PhotoController,
 104         ModuleController,
 105         MemoryListener,
 106         FocusOverlayManager.Listener,
 107         SensorEventListener,                                                          
 108         SettingsManager.OnSettingChangedListener,
 109         RemoteCameraModule,
 110         CountDownView.OnCountDownStatusListener 
因此在没有开启自动旋转或者没有方向传感器的时候可以将

--   private int mOrientation = OrientationEventListener.ORIENTATION_UNKNOWN;
++     private int mOrientation = 270;

搞定!

tp@ubuntu:~/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/project$ make clean make clean_all make[1]: Entering directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/project' make -C /home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/project/../sdk/driver clean make[2]: Entering directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/sdk/driver' make -C SensorDriver clean make[3]: Entering directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/sdk/driver/SensorDriver' make -C drv/src modules_clean make[4]: Entering directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/sdk/driver/SensorDriver/drv/src' /bin/sh: 第 0 行: cd: OLDPWD 未设定 /bin/sh: 第 0 行: cd: OLDPWD 未设定 Makefile:106: obj-m:.o make module_clean make[5]: Entering directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/sdk/driver/SensorDriver/drv/src' /bin/sh: 第 0 行: cd: OLDPWD 未设定 /bin/sh: 第 0 行: cd: OLDPWD 未设定 Makefile:106: obj-m:.o make -C /home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/project/kbuild/5.10 M=/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/sdk/driver/SensorDriver/drv/src clean make[6]: Entering directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/sdk/driver/SensorDriver/drv/src' make[6]: *** /home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/project/kbuild/5.10: 没有那个文件或目录。 停止。 make[6]: Leaving directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/sdk/driver/SensorDriver/drv/src' Makefile:145: recipe for target 'module_clean' failed make[5]: *** [module_clean] Error 2 make[5]: Leaving directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/sdk/driver/SensorDriver/drv/src' Makefile:122: recipe for target 'modules_clean' failed make[4]: *** [modules_clean] Error 2 make[4]: Leaving directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/sdk/driver/SensorDriver/drv/src' makefile:60: recipe for target 'clean' failed make[3]: *** [clean] Error 2 make[3]: Leaving directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/sdk/driver/SensorDriver' makefile:35: recipe for target 'SensorDriver_clean' failed make[2]: *** [SensorDriver_clean] Error 2 make[2]: Leaving directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/sdk/driver' ../sdk/sdk.mk:170: recipe for target 'clean_all' failed make[1]: *** [clean_all] Error 2 make[1]: Leaving directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/project' makefile:195: recipe for target 'clean' failed make: [clean] Error 2 (ignored) make -C /home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/project/../sdk/linux clean make[1]: Entering directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/sdk/linux' make[2]: Entering directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/sdk/linux' make[3]: Entering directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/sdk/linux/init/sensor' make -f Makefile -C /home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/project/kbuild/5.10 M=/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/sdk/linux/init/sensor clean RCS_FIND_IGNORE="\( -name SCCS -o -name BitKeeper -o -name .svn -o -name CVS -o -name .pc -o -name .hg -o -name .git -o -name ../../obj/uclibc/9.1.0/sensor.o \) -prune -o" make[4]: Entering directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/sdk/linux/init/sensor' make[4]: *** /home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/project/kbuild/5.10: 没有那个文件或目录。 停止。 make[4]: Leaving directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/sdk/linux/init/sensor' Makefile:136: recipe for target 'module_clean' failed make[3]: *** [module_clean] Error 2 make[3]: Leaving directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/sdk/linux/init/sensor' makefile:57: recipe for target 'sensor_module_clean' failed make[2]: *** [sensor_module_clean] Error 2 make[2]: Leaving directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/sdk/linux' makefile:69: recipe for target 'clean' failed make[1]: *** [clean] Error 2 make[1]: Leaving directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/sdk/linux' makefile:195: recipe for target 'clean' failed make: [clean] Error 2 (ignored) make linux-kernel_clean make[1]: Entering directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/project' make[2]: Entering directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/kernel' make[3]: Entering directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/kernel' grep: 警告: GREP_OPTIONS 已被废除; 请使用别名或脚本 /usr/bin/strings: gitInformation.txt:无此文件 make[3]: Leaving directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/kernel' make[2]: Leaving directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/kernel' make[1]: Leaving directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/project' make image_clean make[1]: Entering directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/project' make -C image clean make[2]: Entering directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/project/image' configs/general/nor.squashfs.partition.config:40: cisboottab0:,(CIS),,,@(ENV) grep: 警告: GREP_OPTIONS 已被废除; 请使用别名或脚本 rm -rf /home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/project/image/output make[2]: Leaving directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/project/image' make[1]: Leaving directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/project' make symbol_link_clean make[1]: Entering directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/project' rm /home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/project/kbuild/5.10 -rf make[1]: Leaving directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/project' make headfile_link_clean make[1]: Entering directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/project' make[1]: Leaving directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/project' make boot_clean make[1]: Entering directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/project' make[2]: Entering directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/boot' make[3]: Entering directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/boot' grep: 警告: GREP_OPTIONS 已被废除; 请使用别名或脚本 make[3]: Leaving directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/boot' make[2]: Leaving directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/boot' make[1]: Leaving directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/project' make codesize_clean make[1]: Entering directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/project' make[1]: Nothing to be done for 'codesize_clean'. make[1]: Leaving directory '/home/tp/Project/AOV-课题/软件sdk/Iford_IMD00V5.1.1/Iford_IMD00V5.1.1/SourceCode/project'
最新发布
09-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值