android不同的定制系统的机型适配和不同版本系统api sdk的适配

来源:互联网 发布:平板电脑网络转换器 编辑:程序博客网 时间:2024/05/22 03:34

1,不同android api版本的兼容

2,不同厂商定制系统的兼容

3,不同尺寸分辨率的兼容

4,不同cpu框架的兼容

5.网络的制式 

6.语言国家

 7.硬件设备

 8.运行商 




可以说小米手机对android系统定制得让人头痛,好好的应用跑在小米手机上多多少少会点问题。
  • 1
  • 2
  • 短信发送失败无回调 
    在发送短信时候,若系统拦截之后,若用户点击拒绝发送短信,这个时候发现一直收不到系统发送短信失败的广播回调,就会出现无回调不知道短信是否发送成功,这对于需要监听短信发送结果的要求是一个打击,用户往往很可能拒绝发送短信。` 
    解决方案:使用安卓系统的权限管理进行权限,既能接受说明发送短信意图也能收到回调。这个时候系统在有权限申请之后,不会再默认拦截了。
  • 应用安装完成后打开应用出现初始化两次 
    是指在调用系统安装应用程序完成安装之后,若用户直接通过这个程序打开应用进入之后,用户按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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 静态注册广播收不到广播 
    在注册系统广播之后,收到广播是有条件,并不是每次都能够收到,在该品牌机型中要求:Receiver注册不能配置运行在非该应用包名下的进程中,否则收不到广播,广播只给不配置android:process的Receiver。同时要求是在当前进程应用没有退出的前提下,否则也收不到。 
    暂没有找到解决方案

华为荣耀

  • Toast不显示

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

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

金立

receiver查询不到

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

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

List<ResolveInfo> lists = manager.queryBroadcastReceivers(intent,                PackageManager.GET_DISABLED_COMPONENTS);
  • 1
  • 2

Oppo手机

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

权限适配问题

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

 <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
  • 1

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

如华为6.0系统手机

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

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

  targetSdkVersion 23
  • 1

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


 作为Android开发者,当你需要将产品在某某品牌的某某机型上进行兼容性适配的时候,最为基础的适配方法是通过代码层面区分适配机型来为程序进行针对性的改变程序执行流向。

这里写图片描述

1. Build类包含的信息 
  Android Build类可以从系统属性中提取设备硬件和版本信息,主要功能: 
这里写图片描述 
  主要读取的是手机系统\system\build.prop(Galaxy Nexus为例) 
这里写图片描述

2. Build工作原理

  • Build类:记录一系列静态属性

厂商/品牌/机型/主板型号/CPU指令集··········· 
这里写图片描述

Build类的记录的设备信息主要是调用SystemProperties类的get()方法,SystemProperties的实现主要由JNI接口实现。 
android.os.SystemProperties此类未开放(未提供给SDK API),能够在frameworks和android自带的APP里使用(比如Settings app里),不能被其他app直接使用,只能通过Build等类来使用.

  • SystemProperties:系统属性

相当于windows的注册表,由key和value组成,且都是核心系统的一个基本机制。 
Android 的系统属性包括两部分:文件保存的持久属性和每次开机导入的cache属性。前者主要保存在下面几个文件中(目录下),后者则通过API方式使用。 
/default.prop 
/system/build.prop 
/system/default.prop 
/data/local.prop 
/data/property目录下的所有presist属性(以presist.开头) 
JNI接口:在android_os_SystemProperties.cpp定义,在frameworks/base/core/jni/AndroidRuntime.cpp中注册JNI。

3. 部分已知适配问题

  由于Android系统的开放性,各大OEM厂商会以Android为基础为手机开发自己的ROM,上面的程序片段通过判断厂商和机型的方式来进行代码层面的适配,理论上这里不会有问题发生,但实际上获取厂商信息和机型信息的时候会出现你想像不到情况发生:

情况一:厂商信息获取不唯一 
摩托罗拉的厂商信息不仅是”motorola”还有”mot”和”FIH”; 
索爱的厂商信息不仅是”Sony”还有”Sony Ericsson”; 
HTC的厂商信息不仅是”HTC”还有”HUN”; 
OPPO的厂商信息不仅是”OPPO”还有”alps”; 
酷派的厂商信息不仅是”CoolPad”还有”YuLong”; 
….. 
情况二:机型信息获取比较奇葩 
红米model值为数字,model值为“2013022”的奇葩字符串。 
….. 
情况三:厂商信息或机型信息获取为unknown 
联想A60获取厂商信息为unknown;造成这种问题的原因是厂商随意改动framework层导致的。

4. 适配建议 
  根据以上情况希望可以为Android开发者同学在适配工作中提供一定的借鉴和帮助。 
我们给出的第一种解决方案是“规避已知问题”。例如,厂商信息不唯一时,我们就搜罗该厂商信息的所有可能,从而进行准确的判断,如下: 
这里写图片描述 
当获取机型信息为unknown时,我们还可以通过手机设备的其他信息来判断手机具体机型,如下: 
这里写图片描述 
第二种解决方案,也是最理想的解决方案“设备数据匹配”。大家都知道,从android.os.build类中,我们可以获取到很多设备的信息,既然一个机型的设备是一样的,我们可以统计所有机型的设备信息得到一个数据库,当机型获取为unknown时,通过已知信息匹配,得到达到一定匹配率的机型(90%或者更高),就可以认为匹配成功。


阅读全文
0 0