简介

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

机制

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

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

实现

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

效果如图:

小米手机 测试效果

华为手机测试效果

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

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

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

  1. public class MTKDualSim extends AbsSim {// 采用MTK方案的类(根据厂家SDK实现不同的接口)
  2. private Object mMSimTelephonyManager = null;
  3. private Object mTelephonyMSim = null;
  4. public MTKDualSim() {
  5. mCallLogExtraField = "simid";
  6. String str1 = SimManager.getModel();
  7. String str2 = SimManager.getManufaturer();
  8. if ((str1 != null) && (str2 != null)) {
  9. String str3 = str1.toLowerCase();
  10. String str4 = str2.toLowerCase();
  11. if ((str4.indexOf("huawei") > -1) && (str3.indexOf("h30-t00") > -1))
  12. mCallLogExtraField = "subscription";
  13. if ((str4.indexOf("hisense") > -1)
  14. && (str3.indexOf("hs-u970") > -1)) {
  15. mCallLogExtraField = "subtype";
  16. }
  17. }
  18. }
  19. @Override
  20. public boolean directCall(String paramString, int paramInt) {
  21. <span style="white-space:pre">      </span>……
  22. return false;
  23. }
  24. @Override
  25. public AbsSim detect() {
  26. return super.detect();
  27. }
  28. @Override
  29. public String getSimPhoneNumber(int paramInt) {
  30. return "";
  31. }
  32. @Override
  33. public int getDataState(int paramInt) {
  34. return -1;
  35. }
  36. @Override
  37. public String getIMSI(int paramInt) {
  38. return getIMSI(paramInt, null);
  39. }
  40. @Override
  41. public String getIMSI(int paramInt, Context paramContext) {
  42. return null;
  43. }
  44. @Override
  45. public int getPhoneState(int paramInt) {
  46. return 0;
  47. }
  48. @Override
  49. public boolean isServiceAvaliable(int paramInt) {
  50. return false;
  51. }
  52. @Override
  53. public boolean isSimStateIsReady(int paramInt) {
  54. return false;
  55. }
  56. @Override
  57. public int getSimOperator(int paramInt) { // 注意
  58. return 0;
  59. }
  60. @Override
  61. protected Object getITelephonyMSim(int paramInt) {
  62. if (mTelephonyMSim == null)
  63. mTelephonyMSim = ITelephony.Stub.asInterface(ServiceManager
  64. .getService("phone"));
  65. return mTelephonyMSim;
  66. }
  67. @Override
  68. protected Object getMSimTelephonyManager(int paramInt) {
  69. return null;
  70. }
  71. }

再列举一款单卡的方案:

  1. public class SingleSim extends AbsSim implements IDualDetector {// 单卡方案
  2. private final String TAG = getClass().getSimpleName();
  3. private HashMap<String, Byte> mCallLogExtraFields = new SingleSim$1(this);
  4. @Override
  5. public boolean hasSimPhone() {
  6. return false;
  7. }
  8. @Override
  9. public AbsSim detect() {// 根据某些字段判是否为双卡(有可能误判)
  10. return this;
  11. }
  12. @Override
  13. public boolean isDualSimPhone() {
  14. return mIsDualSimPhone;
  15. }
  16. @Override
  17. public int getSimSlotNum() {
  18. return 1;
  19. }
  20. @Override
  21. public String getSimPhoneNumber(int paramInt) {
  22. return ((TelephonyManager) getMSimTelephonyManager(0)).getLine1Number();
  23. }
  24. @Override
  25. public int getDataState(int paramInt) {
  26. return ((TelephonyManager) getMSimTelephonyManager(0)).getDataState();
  27. }
  28. @Override
  29. public String getIMSI(int paramInt) {
  30. return ((TelephonyManager) getMSimTelephonyManager(0)).getDeviceId();
  31. }
  32. @Override
  33. public String getIMSI(int paramInt, Context paramContext) {
  34. return ((TelephonyManager) getMSimTelephonyManager(0))
  35. .getSubscriberId();
  36. }
  37. @Override
  38. public int getPhoneState(int paramInt) {
  39. return ((TelephonyManager) getMSimTelephonyManager(0)).getCallState();
  40. }
  41. @Override
  42. public boolean isServiceAvaliable(int paramInt) {
  43. return false;
  44. }
  45. @Override
  46. public boolean isSimStateIsReady(int paramInt) {
  47. return ((TelephonyManager) getMSimTelephonyManager(0)).getSimState() == 5;
  48. }
  49. @Override
  50. public int getSimOperator(int paramInt) {
  51. TelephonyManager localTelephonyManager = (TelephonyManager) getMSimTelephonyManager(paramInt);
  52. return Integer.parseInt(localTelephonyManager.getSimOperator());
  53. }
  54. @Override
  55. protected Object getITelephonyMSim(int paramInt) {
  56. return SimManager.getInstance().getITelephonyByPhone();
  57. }
  58. @Override
  59. protected Object getMSimTelephonyManager(int paramInt) {
  60. return SimManager.getInstance().getTelephonyManagerByPhone();
  61. }
  62. }
总结

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

项目下载

转: http://blog.csdn.net/banketree/article/details/24306493

Android 双卡双待识别的更多相关文章

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

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

  2. Android 人脸识别

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

  3. android指纹识别、拼图游戏、仿MIUI长截屏、bilibili最美创意等源码

    Android精选源码 一个动画效果的播放控件,播放,暂停,停止之间的动画 用 RxJava 实现 Android 指纹识别代码 Android仿滴滴打车(滴滴UI)源码 Android高仿哔哩哔哩动 ...

  4. Android指纹识别

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

  5. Android指纹识别深入浅出分析到实战(6.0以下系统适配方案)

    指纹识别这个名词听起来并不陌生,但是实际开发过程中用得并不多.Google从Android6.0(api23)开始才提供标准指纹识别支持,并对外提供指纹识别相关的接口.本文除了能适配6.0及以上系统, ...

  6. 腾讯优测干货精选|Android双卡双待适配——隐藏在数据库中的那些秘密

    腾讯优测是专业的app自动化测试平台,除了提供兼容性测试,远程真机租用等多维度的测试服务,还有优分享-腾讯内部的移动研发测试干货精选~ 许多APP都希望获取用户通讯录联系人,利用通讯录关系链信息来丰富 ...

  7. Android ocr识别文字介绍(文字识别)

    最近在做身份证号码识别,在网上搜索的一番后发现目前开源的OCR中tesseract-ocr算是比较强大的了,它由HP于1985年到1995年间开发,后来由google直接负责,经过谷歌进一步开发后,目 ...

  8. 集成Android人脸识别demo分享

    本应用来源于虹软人工智能开放平台,人脸识别技术工程如何使用? 1.下载代码 git clone https://github.com/andyxm/ArcFaceDemo.git 2.下载虹软人脸识别 ...

  9. Android人脸识别Demo竖屏YUV方向调整和图片保存

    本博客包含三个常用方法,用于盛开Android版人脸识别Demo中竖屏使用时送入yuv数据,但一直无法识别的情况. 1.首先可以尝试顺时针旋转90°或270°,然后送入识别SDK. 2.旋转方向后依然 ...

随机推荐

  1. 统计SqlServer每张表内的数据量

    CREATE TABLE #temp (TableName VARCHAR (255), RowCnt INT)EXEC sp_MSforeachtable 'INSERT INTO #temp SE ...

  2. python 学习 : 一个简单的秒表

      游戏说明:绿色数字(左边表示成功停止在整秒的次数,右边表示停止的总次数) 点击stop,如果小数点后为0,即你停止的时间是整秒数,右上方斜杠左边数字加一 把代码复制到这个网页code run he ...

  3. Activiti学习(二)数据表结构

    Activiti工作流引擎数据库表结构 数据库表的命名 Acitiviti数据库中表的命名都是以ACT_开头的.第二部分是一个两个字符用例表的标识.此用例大体与服务API是匹配的. l        ...

  4. tyvj1087 sumsets

    背景 广东汕头聿怀初中 Train#2 Problem1 描述     正整数N可以被表示成若干2的幂次之和.例如,N = 7时,共有下列6种不同的方案:1) 1+1+1+1+1+1+12) 1+1+ ...

  5. QString 和std::string互转

    std::string cstr; QString qstring; //****从std::string 到QString qstring = QString(QString::fromLocal8 ...

  6. Linux下vim 开发环境配置及配色(Ruby)

    终端设置 字体:Monospace 10 粗体 内置方案M:黑底白字 内置方案S:Linux控制台 安装vundle git clone https://github.com/VundleVim/Vu ...

  7. 2.mongoDB add user in v3.0 问题的解决(Property 'addUser' of object admin is not a func)

    问题:创建mongodb帐户时,出错 > db.addUser('jyu', 'aerohive')  2015-08-05T20:03:02.767+0800 E QUERY    TypeE ...

  8. Python复习之下划线的含义

    __xx__ 系统定义名字 __xx 双下划线的表示的是私有类型的变量.只能是允许这个类本身进行访问了.连子类也不可以 _xx 单下划线 不能用'from moduleimport *'导入 即保护类 ...

  9. 调整 ANTD 组件菜单的字体大小。

    调整 ANTD 组件菜单的字体大小:经过多次试验,原有字体太小,只有12px,通过下列CSS 强制加大. 1.分组子菜单(标题) .ant-menu-inline > .ant-menu-sub ...

  10. java21

    1:字符流(掌握) (1)字节流操作中文数据不是特别的方便,所以就出现了转换流. 转换流的作用就是把字节流转换字符流来使用. (2)转换流其实是一个字符流 字符流 = 字节流 + 编码表 (3)编码表 ...