关于android版本兼容的一些问题

近期关于项目中踩了一些兼容性的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

百度 & 谷歌未果,很伤。

希望以后有能力解决上面这些问题。

你可能感兴趣的:(Android疑难杂症)