简介

Android双卡双待已经越来越普及了,解决双卡双待管理是广大手机开发人员必须得面对的问题,为实现Android平台的双卡双待操作,笔者研究了Android 应用层操作双卡双待的机制。

机制

获取基于ITelephony接口实现phone应用中的“phone服务”,通过TelephonyManager接口获取不同的卡(GSMPhone /CDMAPhone)进行不同的操作(拨号、接通、挂断、保持通话等)。

Android平台是一个多样型的平台,不同的手机获取ITelephony接口不同,用一种方法实现双卡双待管理是不可取的。那怎么办呢?只有针对不同的手机分析出一套管理的方案,该方案实现难度大,因为需要各个厂家的SDK的资料。为了实现该功能,笔者做了大量工作,整合各个厂家的SDK的资料。

实现

为了更好的管理双卡双待的问题,新建一个双卡双待模块静态库,其它项目引用便是,项目如图:

效果如图:

小米手机 测试效果

华为手机测试效果

AbsSim是抽象类,负责实现手机操作的类。不同的厂家继承该类实现各自的接口。AbsSim信息如下:

public abstract class AbsSim implements IDualDetector { //抽象基类protected final String TAG = getClass().getSimpleName();protected ArrayList<SimSlot> mSimSlots = new ArrayList<SimSlot>();protected boolean mIsDualSimPhone = false;protected String mCallLogExtraField = "";public abstract String getSimPhoneNumber(int paramInt); // 返回手机号码public abstract int getDataState(int paramInt);// 返回数据状态public abstract String getIMSI(int paramInt);// 返回手机标识public abstract String getIMSI(int paramInt, Context paramContext);// 返回手机标识public abstract int getPhoneState(int paramInt);// 返回手机状态public abstract boolean isServiceAvaliable(int paramInt);// 服务是否可用public abstract boolean isSimStateIsReady(int paramInt);// 卡是否在使用public abstract int getSimOperator(int paramInt);// 服务商(电信、移动、联通)protected abstract Object getITelephonyMSim(int paramInt);// 获取操作接口protected abstract Object getMSimTelephonyManager(int paramInt);// 获取操作接口}

现在列举一款实现MTK方案:

public class MTKDualSim extends AbsSim {// 采用MTK方案的类(根据厂家SDK实现不同的接口)private Object mMSimTelephonyManager = null;private Object mTelephonyMSim = null;public MTKDualSim() {mCallLogExtraField = "simid";String str1 = SimManager.getModel();String str2 = SimManager.getManufaturer();if ((str1 != null) && (str2 != null)) {String str3 = str1.toLowerCase();String str4 = str2.toLowerCase();if ((str4.indexOf("huawei") > -1) && (str3.indexOf("h30-t00") > -1))mCallLogExtraField = "subscription";if ((str4.indexOf("hisense") > -1)&& (str3.indexOf("hs-u970") > -1)) {mCallLogExtraField = "subtype";}}}@Overridepublic boolean directCall(String paramString, int paramInt) {
        ……return false;}@Overridepublic AbsSim detect() {return super.detect();}@Overridepublic String getSimPhoneNumber(int paramInt) {return "";}@Overridepublic int getDataState(int paramInt) {return -1;}@Overridepublic String getIMSI(int paramInt) {return getIMSI(paramInt, null);}@Overridepublic String getIMSI(int paramInt, Context paramContext) {return null;}@Overridepublic int getPhoneState(int paramInt) {return 0;}@Overridepublic boolean isServiceAvaliable(int paramInt) {return false;}@Overridepublic boolean isSimStateIsReady(int paramInt) {return false;}@Overridepublic int getSimOperator(int paramInt) { // 注意return 0;}@Overrideprotected Object getITelephonyMSim(int paramInt) {if (mTelephonyMSim == null)mTelephonyMSim = ITelephony.Stub.asInterface(ServiceManager.getService("phone"));return mTelephonyMSim;}@Overrideprotected Object getMSimTelephonyManager(int paramInt) {return null;}
}

再列举一款单卡的方案:

public class SingleSim extends AbsSim implements IDualDetector {// 单卡方案private final String TAG = getClass().getSimpleName();private HashMap<String, Byte> mCallLogExtraFields = new SingleSim$1(this);@Overridepublic boolean hasSimPhone() {return false;}@Overridepublic AbsSim detect() {// 根据某些字段判是否为双卡(有可能误判)return this;}@Overridepublic boolean isDualSimPhone() {return mIsDualSimPhone;}@Overridepublic int getSimSlotNum() {return 1;}@Overridepublic String getSimPhoneNumber(int paramInt) {return ((TelephonyManager) getMSimTelephonyManager(0)).getLine1Number();}@Overridepublic int getDataState(int paramInt) {return ((TelephonyManager) getMSimTelephonyManager(0)).getDataState();}@Overridepublic String getIMSI(int paramInt) {return ((TelephonyManager) getMSimTelephonyManager(0)).getDeviceId();}@Overridepublic String getIMSI(int paramInt, Context paramContext) {return ((TelephonyManager) getMSimTelephonyManager(0)).getSubscriberId();}@Overridepublic int getPhoneState(int paramInt) {return ((TelephonyManager) getMSimTelephonyManager(0)).getCallState();}@Overridepublic boolean isServiceAvaliable(int paramInt) {return false;}@Overridepublic boolean isSimStateIsReady(int paramInt) {return ((TelephonyManager) getMSimTelephonyManager(0)).getSimState() == 5;}@Overridepublic int getSimOperator(int paramInt) {TelephonyManager localTelephonyManager = (TelephonyManager) getMSimTelephonyManager(paramInt);return Integer.parseInt(localTelephonyManager.getSimOperator());}@Overrideprotected Object getITelephonyMSim(int paramInt) {return SimManager.getInstance().getITelephonyByPhone();}@Overrideprotected Object getMSimTelephonyManager(int paramInt) {return SimManager.getInstance().getTelephonyManagerByPhone();}
}
总结

利用java 反射机制操作Android隐藏的类,很好的解决了双卡双待的问题。
Java反射是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等)、superclass(例如Object)、实现之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。

项目下载

Android 双卡双待识别相关推荐

  1. android 双卡识别,Android 双卡双待识别

    简介 Android双卡双待已经越来越普及了,解决双卡双待管理是广大手机开发人员必须得面对的问题,为实现Android平台的双卡双待操作,笔者研究了Android 应用层操作双卡双待的机制. 机制 获 ...

  2. 解决 Android 双卡双待识别

    Android开发的问题 其实很好狠.今天看到一篇解决android 机型 双卡 管理的问题.看到一篇比较好的文章就转载过来了 = = 转载:http://blog.csdn.net/banketre ...

  3. Android 人脸识别

    Android人脸识别技术,可以参考下面的网站. http://www.faceplusplus.com.cn/ 本项目使用的就是该网站的api. 项目具体使用的技术代码 /*** 用来压缩图片的方法 ...

  4. 华为DUA-AL00真机android studio识别不出

    华为DUA-AL00真机android studio识别不出 当时花了1000元买的真机,直到现在都感觉华为的这个型号的时候是真的难用,显示日志需要特殊的配置,甚至连接计算机调试都比别的手机麻烦. 这 ...

  5. 神目 Android 人脸识别SDK编译说明

    1.介绍 该文章介绍了神目 AI开放平台Android SDK 基于Android Studio的编译方法 2.Android SDK下载 登录神目AI开放平台下载Android人脸识别SDK打包文件 ...

  6. Android指纹识别

    Android指纹识别 原文:Android指纹识别 上一篇讲了通过FingerprintManager验证手机是否支持指纹识别,以及是否录入了指纹,这里进行指纹的验证. //获取Fingerprin ...

  7. ubuntu创建wifi热点(android可识别)亲测可用

    转自http://jingyan.baidu.com/article/ea24bc39b03fc6da62b331f0.html 如何在ubuntu系统下创建android可识别热点?一般环境下创建的 ...

  8. Android 双卡双待支持检验SIM信息获取

    Android 双卡双待支持检验及SIM信息获取 本文将从应用开发者的角度分析手机是否支持双卡双待,获取如果说希望自己做出支持双卡双待的系统,本文估计就不适合你了,能力不足,还望见谅啊 好了,为了迎合 ...

  9. Android拍照识别身份证SDK

    Android拍照识别身份证SDK 一.Android拍照识别身份证应用背景 这些年,随着互联网金融的极速发展,第三方支付.理财.P2P网贷.征信等APP应用成爆发式的增长,在众多APP中都涉及到对身 ...

最新文章

  1. 使用amaze ui的分页样式封装一个通用的JS分页控件
  2. 如何使用LocalBroadcastManager?
  3. 中小型研发团队架构实践:微服务架构
  4. 浅谈List保存的数据是引用数据类型的地址
  5. 使用Spring Boot搭建你的第一个应用程序
  6. softmax with cross-entropy loss求导(转载+细节整理)
  7. 树莓派4b装系统_树莓派4B初次使用--系统安装|配置
  8. 论文浅尝 | 基于知识库的自然语言理解 04#
  9. Linux中fdisk对应的c函数,linux下fdisk命令实战案例之详解
  10. BugTracker.NET安装指南
  11. python程序设计基础第三版_Python程序设计(第三版)PPT及源码
  12. 引用父类成员的关键字是java_Java 中对父类成员访问用的关键字是 ,而引用当前对象的关键字是 。_学小易找答案...
  13. fpga多摩川编码器开源代码_F28379D之CLB解码多摩川编码器1——入手小知识(原创)...
  14. python mysql扩展,python-sql-faker:轻量级、易拓展的数据库智能填充开源库(Python实现版)...
  15. jQuery菜鸟教程02
  16. win7系统如何添加打印机服务器,怎样如何添加打印机驱动步骤
  17. [爆笑]吃了伟哥的公鸡
  18. 【案例实战】不会慢 SQL优化?收藏一下这个例子
  19. VPP学习(二)VPP安装
  20. 清明节主题PPT模板

热门文章

  1. Flask-APScheduler使用教程 1
  2. 户外直播、移动直播遇到弱网信号差,如何保证流畅又高清画面传输
  3. Cache数据库入门
  4. 鼠标悬浮显示图片和文字
  5. 其他:鼠标滚轴坏了如何修?
  6. 混淆矩阵、ROC、AUC 学习记录
  7. python3如何实现一行输入,空格隔开
  8. 使用css设置div块实现阴影呈现3d效果
  9. python xml 创建多个同名子节点_果粉有福了!5分钟学会用Python统计自己最爱听的音乐...
  10. 最终幻想X-2国际版+最终任务