腾讯优测是专业的自动化测试平台,提供全面兼容适配测试,远程真机租用等多维度的测试服务!
作为一名“艰苦卓绝”的软件工程师,我在开发路上经常被各种奇葩情况虐的体无完肤。。。今天就想与大家分享一个我在适配过程中遇到的特殊状况,希望工程师们多加注意。
爱护程序猿,人人有责。阿门。。。
闲话不多说,步入正题。相信大家都用过 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来计算修正角度,他的角度计算方法如下:
mLastOrientation就是他最后用来设置修正角度的值:
access$2802的small代码是这样的:
roundOrientation方法:
所以,针对VIVO V1,我们需要通过手机屏幕的旋转角度来计算Camera成像的修正角度。目前还没有足够的测试来证明这个方法是否通用,所以建议大家在使用时做好机型开关判断。