转载

Android机型适配之痛

CSDN移动将持续为您优选移动开发的精华内容,共同探讨移动开发的技术热点话题,涵盖移动应用、开发工具、移动游戏及引擎、智能硬件、物联网等方方面面。如果您想投稿、参与内容翻译工作,或寻求近匠报道,请发送邮件至tangxy#csdn.net(请把#改成@)。 

Android平台的诞生为手机智能化的普及立下汗马功劳,但其最大的缺点也越来越凸显,那就是碎片化严重:设备繁多、品牌众多、版本各异,芯片、摄像头、分辨率不统一等等,这些都逐渐成为Android系统发展的障碍,碎片化严重不仅造成Android系统混乱,也导致Android应用隐形开发成本的增多。本文中详细介绍了Android琳琅满目的适配问题。

一、个性化十足的Launcher

快捷方式虽然看起来只是一个很小的功能点,但是它涉及到的机型适配问题很多。

快捷方式创建代码:

ntent addShortCut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT"); addShortCut.putExtra(Intent.EXTRA_SHORTCUT_NAME, title); // 不允许重复创建 addShortCut.putExtra("duplicate", false); addShortCut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon); addShortCut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent); sendBroadcast(addShortCut);

1. 无法创建快捷方式

越来越多的手机厂商取消了快捷方式的概念,导致我们无法通过代码创建一个自己真实需要的快捷方式,数据显示,这样的手机约占13%。

Android机型适配之痛

2. 重复创建快捷方式

通常情况下,我们是不希望自己的快捷方式被重复创建。 使用addShortCut.putExtra("duplicate", false);方法就能达到目的, 但是市面上至少有8%的手机,即使设置了duplicate为false,还是可以重复创建快捷方式。

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

Android Launcher源码:

Android机型适配之痛

2.1 重复创建快捷方式的解决方案V1.X

我们最早使用的解决快捷方式重复创建的方法是:在创建快捷方式前先执行删除操作。 这种方式其实很聪明,因为即使是在快捷方式不存在的情况下执行删除操作也不会有任何异常。这样看来问题解决得太轻松了,但是遗憾的是删除快捷方式同样存在适配问题,数据显示大约21%的手机无法正常删除快捷方式。

另外一种方法是:自行保存快捷方式的创建记录,通过一个字段来记录快捷方式是否已经创建过了,以此来决定是否创建新的快捷方式。这种做法也是因为出现快捷方式无法删除情况后对解决方案进行了一个小的升级,虽然可以解决问题,但是如果程序被清除了数据,那么一切都乱了,还是无法彻底的规避重复的问题。

2.2 重复创建快捷方式的解决方案V2.X

遇到难解的问题还是看看源码吧,Android的Launcher源码在创建快捷方式的时候不仅会判断duplicate的值,还会在数据库中查询一下将要被创建的快捷方式是否已经存在,我们也照做就OK了。

Android机型适配之痛

此外,我们也注意到,查询数据库的时候访问地址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相信大家也不陌生,感觉上像是找到了终极的解决方案,且看下去...

Android机型适配之痛

  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

正文到此结束
Loading...