安卓机型适配之痛

3个月前 (11-27 11:45)阅读4回复0
xxhh
xxhh
  • 管理员
  • 注册排名4
  • 经验值129210
  • 级别管理员
  • 主题25842
  • 回复0
楼主

  Android平台的降生为手机智能化的普及立下汗马勋绩,但其更大的缺点也越来越凸显,那就是碎片化严峻:设备繁多、品牌浩瀚、版本各别,芯片、摄像头、辨认率不同一等等,那些都逐步成为Android系统开展的障碍,碎片化严峻不只形成Android系统紊乱,也招致Android利用隐形开发成本的增加。本文详尽介绍了Android琳琅满目标适配问题。

  一、个性化十足的Launcher

  灵敏体例固然看起来只是一个很小的功用点,但是它涉及到的机型适配问题良多。

  灵敏体例创建代码:

  1. 无法创建灵敏体例

  越来越多的手机厂商取缔了灵敏体例的概念,招致我们无法通过代码创建一个本身现实需要的灵敏体例,数据展现,如许的手机约占13%。

  2. 反复创建灵敏体例

  凡是情状下,我们是不期看本身的灵敏体例被反复创建。利用addShortCut.putExtra("duplicate", false);办法就能到达目标,但是市道上至少有8%的手机,即便设置了duplicate为false,仍是能够反复创建灵敏体例。

  代表手机品牌为:华为、中兴、HTC。

  Android Launcher源码:

  2.1 反复创建灵敏体例的处理计划V1.X

  我们最早利用的处理灵敏体例反复创建的办法是:在创建灵敏体例前先施行删除操做。那种体例其实很聪明,因为即便是在灵敏体例不存在的情状下施行删除操做也不会有任何反常。如许看来问题处理得太轻松了,但是遗憾的是删除灵敏体例同样存在适配问题,数据展现大约21%的手机无法一般删除灵敏体例。

  别的一种办法是:自行保留灵敏体例的创建笔录,通过一个字段来笔录灵敏体例能否已经创建过了,以此来决定能否创建新的灵敏体例。那种做法也是因为呈现灵敏体例无法删除情状后对处理计划停止了一个小的晋级,固然能够处理问题,但是假设法式被肃清了数据,那么一切都乱了,仍是无法彻底的躲避反复的问题。

  2.2 反复创建灵敏体例的处理计划V2.X

  碰着难解的问题仍是看看源码吧,Android的Launcher源码在创建灵敏体例的时候不只会揣度duplicate的值,还会在数据库中查询一下将要被创建的灵敏体例能否已经存在,我们也照做就OK了。

  此外,我们也重视到,查询数据库的时候拜候地址URI是一个很重要的因素,问题是数据库的URI比力多,Android原则的URI就有3个:

  ?2.2版本以前的URI是:content://com.android.launcher.settings/favorites?notify=true

  ?2.2~4.3版本的URI是:content://com.android.launcher2.settings/favorites?notify=true

  ?4.4版本以上的目前都是:

  content://com.android.launcher3.settings/favorites?notify=true

  不单单Android本身的Launcher数据库地址浩瀚,厂商本身定义的地址就愈加丰富多彩,如OPPO R827T的拜候URI为:content://com.oppo.launcher.settings /favorites?notify=true;HTC Z715e的拜候地址为: content://com.htc.launcher.settings/favorites?notify=true。事实上 远远不行那些,还有不可胜数的第三方Launcher利用,良多开发者也会修改数据库拜候地址,目前仅我们掌握的差别拜候地址就有多达40种摆布。

  ?通过权限查询URI:

  通过数据库的读写权限来查询对应的URI相信各人也不目生,觉得上像是找到了末极的处理计划,且看下往……

  1.问题一:假设利用完全的权限停止查询——权限浩瀚,我们目前掌握的超越50种。

  2.问题二:假设利用不完全的权限停止查询(READ_SETTINGS)对应关系冗杂,大约有 32% 的手时机对应两个以上的URI。

  例如:

  GT-I8262D:

  authority:com.sec.android.app.launcher.settings ReadPermission:com.android.launcher.permission.READ_SETTINGS

  authority:com.sec.android.app.launcher.settings.id ReadPermission:com.android.launcher.permission.READ_SETTINGS

  Lenovo A278t:

  authority:com.aspire.mm.Settings

  ReadPermission:com.aspire.mm.permission.READ_SETTINGS

  authority:com.huaqin.launcherEx.settings ReadPermission:com.huaqin.launcherEx.permission.READ_SETTINGS

  authority:com.huaqin.thememgr.Settings ReadPermission:com.huaqin.thememgr.permission.READ_SETTINGS

  1.问题一:假设利用完全的权限停止查询——权限浩瀚,我们目前掌握的超越50种。

  2.问题二:假设利用不完全的权限停止查询(READ_SETTINGS)对应关系冗杂,大约有 32% 的手时机对应两个以上的URI。

  例如:

  GT-I8262D:

  authority:com.sec.android.app.launcher.settings ReadPermission:com.android.launcher.permission.READ_SETTINGS

  authority:com.sec.android.app.launcher.settings.id ReadPermission:com.android.launcher.permission.READ_SETTINGS

  Lenovo A278t:

  authority:com.aspire.mm.Settings

  ReadPermission:com.aspire.mm.permission.READ_SETTINGS

  authority:com.huaqin.launcherEx.settings ReadPermission:com.huaqin.launcherEx.permission.READ_SETTINGS

  authority:com.huaqin.thememgr.Settings ReadPermission:com.huaqin.thememgr.permission.READ_SETTINGS

  二、多姿多彩的Camera

  1. Intent挪用手机内相机法式

  假设我们设置了照片的存储途径,那么很可能会碰着以下三种问题:

  ?问题一:onActivityResult办法中的data返回为空(数据表白,93%的机型的data将会是Null,所以假设我们指定了途径,就不要利用data来获取照片,最少在利用前要做空揣度)。

  ?问题二:照片无法存储。

  假设自定义存储途径是/mnt/sdcard/lowry/,而手机SD卡下在摄影前没有名为lowry的文件夹,那么部门手机摄影后图片将不会保留,招致我们无法获得照片,大大都手机的相机碰着文件夹不存在的情状城市本身创建出不存在的文件夹,而个别手机却不会创建,其代表机型为:三星I8258、华为H30-T00、红米等。

  处理的办法就是在指定存储途径前先揣度途径中的文件夹能否都存在,不存在先创建再挪用相机。

  ?问题三:照片能够存储,但是名字不合错误。

  file:///mnt/sdcard/123 1.jpg,因为URI的fromFile办法会将途径中的空格用“%20”代替。

  其实关于大大都的手机那都不算事,手机在解析存储途径的时候城市将“%20”替代为空格,如许现实上最末的照片名字仍是我们当初指定的名字:123 1.jpg,遗憾的是个别手机(如酷派7260)系统自带的相机没有将“%20”读成空格,摄影后的照片的名字是123%201.jpg,我们用途径“file:///mnt/sdcard/123 1.jpg”能找到照片才怪!

  总结:

  (1)利用onActivityResult中的intent(data)前要做空揣度。

  (2)指定摄影途径时,先查抄途径中的文件夹能否都存在,不存在时先创建文件夹再挪用相机摄影。

  (3)指定摄影存储途径时,照片的定名中不要包罗空格等特殊符号。

  2. 通过Camera的open办法挪用手机摄像头

  2.1 持续主动对焦crash

  原因:第一次对焦未完毕,利用层又倡议第二次对焦,招致对焦失败。

  处理计划一:传进AutoFocusCallback;

  处理计划二:延时操做;

  处理计划三:反常捕获。

  2.2 摄像头个数揣度错误

  现象:当我们利用Camera.getNumberOfCameras()办法检测摄像头数量时返回的成果不准确,假设我们测验考试翻开一个不存在的摄像头必定会抛出反常,那也提醒我们在开启Camera摄像头时需要加反常庇护。

  代表机型:联想278T、酷派8022

  2.3 闪光灯的揣度

  我们常用的揣度手机能否撑持闪光灯的办法应该有以下两种:

  办法一:利用getSupportedFlashModes办法;

  办法二:通过PackageManager揣度。

  利用办法一有3.7%的机器成果错误,无法准确地揣度出手机能否有闪光灯,次要的品牌包罗:酷派、天语、联想、三星等。利用办法二有9.7%的机器成果错误,次要品牌包罗:VIVO、金立、酷派、天语、朵唯、三星等。

  我们定见在揣度手机能否有闪光灯的时候将那两种办法结合利用,呈现错误的概率将大大降低。

  2.4 常亮形态与其他形态间的切换

  前提前提是我们设置闪光灯为常亮(Parameters.FLASH_MODE_TORCH),而且闪光灯胜利常亮。此时我们在设置闪光灯形式为Parameters.FLASH_MODE_AUTO后,闪光灯照旧常亮,如许的机型约占热门机型的12%。碰着那种情状我们需要先设置闪光灯形式为Parameters.FLASH_MODE_OFF,封闭闪光灯后再设置其他形式。

  2.5 释放Camera后闪光灯照旧闪亮

  既然开了,我们就要负责关,说实话,以前那个问题底子不在我的考虑范畴内,因为我们在利用Camera的时候城市在Activity被销毁或者暂停时释放Camera。那个时候无论闪光灯是什么形态,城市跟着Camera的释放而封闭。曲到我碰见了OPPO R815T,我的世界看发作了改变,那货假设设置了闪光灯常亮,即便释放了Camera闪光灯照旧稳稳地亮着。

  并且因为Camera被释放掉了,你再也没办法封闭闪光灯了,封闭App、卸载App,你仍是抠电池关机吧……所以,假设你的法式中有设置闪光灯为常亮形态的操做,定见在释放Camera前先将闪光灯设置为封闭(Parameters.FLASH_MODE_OFF)形态。

  更多详情:

  

0
回帖

安卓机型适配之痛 期待您的回复!

取消