腾讯优测是专业的自动化测试平台,提供全面兼容适配测试,远程真机租用等多维度的测试服务!
做为一名“坚苦卓绝”的软件工程师,我在开发路上常常被各类奇葩状况虐的体无完肤。。。今天就想与你们分享一个我在适配过程当中遇到的特殊情况,但愿工程师们多加注意。
爱护程序猿,人人有责。阿门。。。android
闲话很少说,步入正题。相信你们都用过 android.hardware.Camera,那就必定接触过Camera的 setDisplayOrientation方法。该方法是用来设置显示Camera在预览状态下的顺时针旋转度,关于这个修正角度的计算,官方文档有个范例:测试
在这个例子中,CameraInfo很是重要,最终的角度计算就是根据CameraInfo中orientation 值获得的。因此,若是这个值不许确的话,咱们的角度就有可能出现错误。
我在作某款产品的适配时遇到一个奇怪的现象,在使用VIVO V1手机打开该产品时,首次打开扫描二维码功能,预览画面的角度正常,可是退出再进来的时候角度就偏转了90度。通过反复测试后,我找到了一个规律:只有重启手机后,第一次进入该页面时画面的角度才是正常的。
经过一系列的log调查,我发现当第一次应用此款手机获取CameraInfo的orientation值是90。而当我执行了mCamera = Camera.open();以后再获取CameraInfo的orientation值时就是0,并且之后获取的都是0。除非咱们重启手机,不然都没有变化。
那么有人就会说,咱们能够第一次获取orientation后将值保存到本地,之后读取本地数据就能够了。刚开始我也有这样的想法,但状况远非如此简单。当我重启手机后打开系统的照相机功能,以后再获取CameraInfo的orientation结果依旧是0。
也就是说,不管是这款手机上的哪一个应用,只要执行了一次Camera.open()以后,其余全部程序中获取CameraInfo的orientation都是0,因此这个解决方案是不可行的。
但问题在于,虽然出现了上述状况,但手机自带的相机却能很好的使用。因而我反编译了VIVO V1的系统相机,果真,系统相机根本没有使用CameraInfo的orientation来计算修正角度,他的角度计算方法以下:spa
mLastOrientation就是他最后用来设置修正角度的值:blog
access$2802的small代码是这样的:开发
roundOrientation方法:rem
因此,针对VIVO V1,咱们须要经过手机屏幕的旋转角度来计算Camera成像的修正角度。目前尚未足够的测试来证实这个方法是否通用,因此建议你们在使用时作好机型开关判断。文档