• 腾讯优测优分享 | 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成像的修正角度。目前还没有足够的测试来证明这个方法是否通用,所以建议大家在使用时做好机型开关判断。

  • 相关阅读:
    Codeforces Global Round 2
    BZOJ4762 最小集合(动态规划+容斥原理)
    BZOJ4621 Tc605(动态规划)
    Luogu5289 十二省联考2019皮配(动态规划)
    Luogu5290 十二省联考2019春节十二响(贪心+启发式合并)
    Luogu5283 十二省联考2019异或粽子(trie/可持久化trie+堆)
    Luogu5284 十二省联考2019字符串问题(后缀数组+拓扑排序+线段树/主席树/KDTree)
    【转】Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask
    android Handler更新UI
    Android 四大组件之Activity生命周期
  • 原文地址:https://www.cnblogs.com/utest/p/5866586.html
Copyright © 2020-2023  润新知