近期关于项目中踩了一些兼容性的bug,这里记录一下。
第一个是用友盟分享组件6.1.1版本,SDK中的分享面板不支持自定义面板背景,比如我想换一个圆角背景,就没办法。于是就反编译看了他们的代码,然后黑了一下,加入了自定义背景接口。结果线上出现了一个bug,原因是下面这段我加入的代码:
if (this.mConfig.mShareboardBgDrawable != null) {
shareMenuLayout.setBackground(this.mConfig.mShareboardBgDrawable);
}
现在来看,显然我犯了一个兼容性错误。
因为API16以下,View中是没有setBackground方法的,只有setBackgroundDrawable方法。这点是我个人疏忽,以前项目中没经历过兼容性,没有这方面意识,然后导致这次错误,最后造成线上4.1.2以下的设备会crash。
修改如下:
if (this.mConfig.mShareboardBgDrawable != null) {
if (Build.VERSION.SDK_INT >= 16)
shareMenuLayout.setBackground(this.mConfig.mShareboardBgDrawable);
else
shareMenuLayout.setBackgroundDrawable(this.mConfig.mShareboardBgDrawable);
}
第二个还是友盟,不过这次是看到中间一段关于 ViewPager
的代码觉得考虑很全面,想贴一下。
…
if (verifyMethodExists())
viewPager.addOnPageChangeListener(listener);
else
viewPager.setOnPageChangeListener(listener);
…
private boolean verifyMethodExists() {
try {
Class viewPagerClass = Class.forName("android.support.v4.view.ViewPager");
Method method = viewPagerClass.getMethod("addOnPageChangeListener", new Class[] { ViewPager.OnPageChangeListener.class });
if (method != null)
return true;
} catch (Exception e) {
Log.e("UMActionFrame verifyMethodExists addOnPageChangeListener error:" + e);
}
return false;
}
v4包中的ViewPager设置监听时,曾经是用setOnPageChangeListener
,现在改成了 addOnPageChangeListener
,因此作为SDK提供商,有必要兼容这两个版本的v4包。
这里友盟也给我们做了示范,如何用反射操作,查看是否有某个方法。
但是有个疑问,一个工程只能有一个v4包,所以无论是set还是add都只能有一个,那这段代码势必要有一个错误,究竟是如何通过编译的?现在还不得而知。
第三个,是一个通讯录功能。
首先声明,我已经添加了权限,targetSdkVersion = 21。
然后线上三星若干型号
的android 5.1.1
手机,还是出现了权限错误:
java.lang.SecurityException: Permission Denial: opening provider com.android.providers.contacts.ContactsProvider2 from ProcessRecord{11c7eb9 16059:com.yipiao/u0a191} (pid=16059, uid=10191) requires android.permission.READ_CONTACTS or android.permission.WRITE_CONTACTS
其余手机正常。
一般来说,设置targetSdkVersion = 23,在6.0上的机子会出现权限问题,因为6.0对权限大改,需要新的对应措施,但是我这里明显不属于这种问题。
此问题暂时未解,只能先try catch。
第四个还是通讯录问题。
我写联系人时,需要批量处理,所以用了ContentProviderOperation.newInsert(…)
,用
context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, …);
这种方式可以把所有号码一次性添加,然后以事务处理的方式进行写入,这样可以提升效率。
但是线上还是出现了兼容性bug:酷派大神的5.1、华为若干机型的4.X都报下面的错。
java.lang.IllegalArgumentException: Unknown authority com.android.contacts
百度 & 谷歌未果,很伤。
希望以后有能力解决上面这些问题。