Android 机型适配问题整理

Androi问题机型适配问题都是老生常谈的话题了,其一出生就注定了成为开发人员心中的疼,随着安卓手机品牌发展众多,一款产品应用发布没有经历过充分的机型适配就上线,接下来的一幕就是开发人员收到了满屏的错误日志发来,这个是某某统计软件搜集到的应用崩溃日志,赶紧适配,开发人员当场就会懵逼。下面就自己这几年应用开发经验遇到过的机型适配问题做个罗列,也欢迎读者提供所遇到的机型适配问题以及解决方案。

小米手机适配

可以说小米手机对android系统定制得让人头痛,好好的应用跑在小米手机上多多少少会点问题。
  • 短信发送失败无回调
    在发送短信时候,若系统拦截之后,若用户点击拒绝发送短信,这个时候发现一直收不到系统发送短信失败的广播回调,就会出现无回调不知道短信是否发送成功,这对于需要监听短信发送结果的要求是一个打击,用户往往很可能拒绝发送短信。`
    解决方案:使用安卓系统的权限管理进行权限,既能接受说明发送短信意图也能收到回调。这个时候系统在有权限申请之后,不会再默认拦截了。
  • 应用安装完成后打开应用出现初始化两次
    是指在调用系统安装应用程序完成安装之后,若用户直接通过这个程序打开应用进入之后,用户按home键退出回到桌面应用程序列表,又点击该应用的icon重新进入该应用,却发现应用是重新打开,而不是继续上次离开的界面,按道理应用不应该重新初始化,后面经搜索发现这是个系统bug。
    解决方案:在启动Activity onCreate方法中进行判断是否重复启动
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //防止重复创建的问题,第一次安装完成启动,和home键退出点击launcher icon启动会重复
        if (!isTaskRoot()
                && getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)
                && getIntent().getAction() != null
                && getIntent().getAction().equals(Intent.ACTION_MAIN)) {

            finish();
            return;
        }
        }
  • 静态注册广播收不到广播
    1) 在注册系统广播之后,收到广播是有条件,并不是每次都能够收到,在该品牌机型中要求:Receiver注册不能配置运行在非该应用包名下的进程中,否则收不到广播,广播只给不配置android:process的Receiver。
    2)要求是在当前进程应用没有退出的前提下,必须应用在前台,一旦退到后台之后,就收不到。
    暂没有找到解决方案

  • 电话权限
    小米机型将调用系统拨号盘的action也使用了CALL_PHONE动态权限进行管控(标准Android设备此行为是不需要权限的,目前也没发现其他厂商有问题),CALL_PHONE属于“电话”权限组,如果此组下有权限是拒绝状态,即使直接拨打电话是询问状态小米系统也不会弹出询问框。
    解决方案:如下方式
    Android 机型适配问题整理_第1张图片

华为机型

  • Toast不显示 (荣耀手机)

也是偶然发现在荣耀8机型上后台应用的toast不会被显示出来,只能当前在前台的应用TOAST提示。
解决方案:替换toast显示,改用其他方式,如dialog或者弹出activity界面。

  • 多网络下指定网络不成功
    简单讲就是指wifi和移动网络同时开着的情况下,不能指定移动网络访问,详见接受说明移步到我的另一篇文章:http://blog.csdn.net/u010019468/article/details/72886859

这个权限是普通权限,在华为6.0手机上,一旦targerSdk》23就没有权限,也不能申请。只能把targetSdk降低到23以下,目前在华为p8电信版手机发现

  • 空字符串AES解密崩溃
    在华为c8817d手机上出现了这个问题,虽然不怎么规范,却反应了这个问题。

金立

  • receiver查询不到

在错误日志中发现金立某些手机尽然对manfiest中组件receiver配置按Interfiter过滤查询结果显示没有找到改组件,这导致发现好多配置错误而导致功能失败,其实实际是存在。后来发现只要改变一个参数flag,且是被系统不推荐使用的参数配置,就没有问题了。

解决方案如下查询receiver是否配置,flag配置成其他的就不行。

List lists = manager.queryBroadcastReceivers(intent,
                PackageManager.GET_DISABLED_COMPONENTS);
  • AlertMangar 或者JobSchedule息屏下不起作用
    在华为荣耀10手机上发现保活 在息屏下没有任何按时回调,息屏下进程还在,依然可以看到存活日志。
    初步怀疑华为定制系统,在息屏下限制保活活动

Oppo手机

  • 移动网络访问权限
    在oppo R9s上发现oppo定制Android权限管理,还增加了对网络访问的权限管理,移动网络和wifi访问还弹出一层用户授权机制,真是一道障碍,这种情况下,当wifi和移动网络同开时,要走移动网络,而此时移动网络还没有来得及经用户授权允许,从导致访问不成功,oppo手机仅仅在移动网络下,第一次问询问用户是否允许,而wifi开着时,则不会。

权限适配问题

在Android 6.0之后新增了权限管理,google这样设计初衷是好的,但是万恶的厂商总喜欢擅自修改定制系统,导致留下一些头疼的适配问题给广大的Android 开发者,下面就讲讲权限适配时出现的问题。

 

这个权限按照系统权限组分组在非危险权限组中,按照Android权限管理的意思,只要在Manifest中配置下就可以了,然而在实际使用中却发现在机型中出现了适配问题。

如华为6.0系统手机

java.lang.SecurityException: cn.com.chinatelecom.account.demo was not granted  either of these permissions: android.permission.CHANGE_NETWORK_STATE.

只要在app中build.gradle中把 targetSdkVersion >=23就会出现这样的问题

  targetSdkVersion 23

若要暂时性的解决这个问题就把targetSdkVersion <=22即可。
但是这个反应了一种不合理,不按常理情况下,就一波草泥马在心中狂奔。

屏幕手势Touch事件

最近在做监听Touch事件时候,在onInterceptTouchEvent拦截事件时候,拦截Move事件,开发时在华为手机上没有什么问题,而在vivo和魅族手机上,却发现点击屏幕时,手势down之后,不移动在这两个手机上却发出了move事件,并且打印的getY值是一样的,这导致了出现了拦截这次点击事件,但是点击事件收不到。而回头到华为手机上时,只有down事件,一旦移动才会有move事件发生,这才是正确的事件分发。
解决办法:故为了兼容,才在move中判断下move下移动距离必须大于0才拦截
吐槽下,华为手机相对还是做的不错,差距在这一点就看出来了。
未完待续。。。

你可能感兴趣的:(Android,细节技巧总结)