腾讯优测优分享 | Android适配中的一些特殊情况小结

Posted 腾讯优测

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了腾讯优测优分享 | 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来计算修正角度,他的角度计算方法如下:


mLastOrientation就是他最后用来设置修正角度的值:



access$2802的small代码是这样的:


roundOrientation方法:



所以,针对VIVO V1,我们需要通过手机屏幕的旋转角度来计算Camera成像的修正角度。目前还没有足够的测试来证明这个方法是否通用,所以建议大家在使用时做好机型开关判断。


以上是关于腾讯优测优分享 | Android适配中的一些特殊情况小结的主要内容,如果未能解决你的问题,请参考以下文章

腾讯优测优分享-Android适配中两个世界的碰撞——视觉&开发

腾讯优测优分享 | 适配路上,避免掉入“扫码调用相机”的坑

腾讯优测优分享 | 适配路上,避免掉入“扫码调用相机”的坑

腾讯优测优分享-如何反编译Android 5.0 framework

腾讯优测优分享-Android平台的碎片化问题解决

腾讯优测优分享 | 谈谈移动端屏幕适配的几种方法