简介

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

机制

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

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

实现

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

效果如图:

小米手机 测试效果

华为手机测试效果

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

publicabstractclassAbsSim implements IDualDetector {//抽象基类

protectedfinal String TAG = getClass().getSimpleName();

protectedArrayList mSimSlots =newArrayList();

protectedboolean mIsDualSimPhone =false;

protectedString mCallLogExtraField ="";

publicabstract String getSimPhoneNumber(intparamInt);// 返回手机号码

publicabstractintgetDataState(intparamInt);// 返回数据状态

publicabstract String getIMSI(intparamInt);// 返回手机标识

publicabstract String getIMSI(intparamInt, Context paramContext);// 返回手机标识

publicabstractintgetPhoneState(intparamInt);// 返回手机状态

publicabstract boolean isServiceAvaliable(intparamInt);// 服务是否可用

publicabstract boolean isSimStateIsReady(intparamInt);// 卡是否在使用

publicabstractintgetSimOperator(intparamInt);// 服务商(电信、移动、联通)

protectedabstract Object getITelephonyMSim(intparamInt);// 获取操作接口

protectedabstract Object getMSimTelephonyManager(intparamInt);// 获取操作接口

}

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

publicclassMTKDualSim extends AbsSim {// 采用MTK方案的类(根据厂家SDK实现不同的接口)

privateObject mMSimTelephonyManager = null;

privateObject mTelephonyMSim = null;

publicMTKDualSim() {

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";

}

}

}

@Override

publicboolean directCall(String paramString,intparamInt) {

……

returnfalse;

}

@Override

publicAbsSim detect() {

returnsuper.detect();

}

@Override

publicString getSimPhoneNumber(intparamInt) {

return"";

}

@Override

publicintgetDataState(intparamInt) {

return-1;

}

@Override

publicString getIMSI(intparamInt) {

returngetIMSI(paramInt, null);

}

@Override

publicString getIMSI(intparamInt, Context paramContext) {

returnnull;

}

@Override

publicintgetPhoneState(intparamInt) {

return0;

}

@Override

publicboolean isServiceAvaliable(intparamInt) {

returnfalse;

}

@Override

publicboolean isSimStateIsReady(intparamInt) {

returnfalse;

}

@Override

publicintgetSimOperator(intparamInt) {// 注意

return0;

}

@Override

protectedObject getITelephonyMSim(intparamInt) {

if(mTelephonyMSim == null)

mTelephonyMSim = ITelephony.Stub.asInterface(ServiceManager

.getService("phone"));

returnmTelephonyMSim;

}

@Override

protectedObject getMSimTelephonyManager(intparamInt) {

returnnull;

}

}

再列举一款单卡的方案:

publicclassSingleSim extends AbsSim implements IDualDetector {// 单卡方案

privatefinal String TAG = getClass().getSimpleName();

privateHashMap mCallLogExtraFields =newSingleSim$1(this);

@Override

publicboolean hasSimPhone() {

returnfalse;

}

@Override

publicAbsSim detect() {// 根据某些字段判是否为双卡(有可能误判)

returnthis;

}

@Override

publicboolean isDualSimPhone() {

returnmIsDualSimPhone;

}

@Override

publicintgetSimSlotNum() {

return1;

}

@Override

publicString getSimPhoneNumber(intparamInt) {

return((TelephonyManager) getMSimTelephonyManager(0)).getLine1Number();

}

@Override

publicintgetDataState(intparamInt) {

return((TelephonyManager) getMSimTelephonyManager(0)).getDataState();

}

@Override

publicString getIMSI(intparamInt) {

return((TelephonyManager) getMSimTelephonyManager(0)).getDeviceId();

}

@Override

publicString getIMSI(intparamInt, Context paramContext) {

return((TelephonyManager) getMSimTelephonyManager(0))

.getSubscriberId();

}

@Override

publicintgetPhoneState(intparamInt) {

return((TelephonyManager) getMSimTelephonyManager(0)).getCallState();

}

@Override

publicboolean isServiceAvaliable(intparamInt) {

returnfalse;

}

@Override

publicboolean isSimStateIsReady(intparamInt) {

return((TelephonyManager) getMSimTelephonyManager(0)).getSimState() == 5;

}

@Override

publicintgetSimOperator(intparamInt) {

TelephonyManager localTelephonyManager = (TelephonyManager) getMSimTelephonyManager(paramInt);

returnInteger.parseInt(localTelephonyManager.getSimOperator());

}

@Override

protectedObject getITelephonyMSim(intparamInt) {

returnSimManager.getInstance().getITelephonyByPhone();

}

@Override

protectedObject getMSimTelephonyManager(intparamInt) {

returnSimManager.getInstance().getTelephonyManagerByPhone();

}

}

总结

利用java 反射机制操作Android隐藏的类,很好的解决了双卡双待的问题。

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

项目下载地址:http://download.csdn.net/detail/banketree/7234239

(来源于:http://blog.csdn.net/banketree/article/details/24306493)

android 双卡识别,Android 双卡双待识别相关推荐

  1. android实现异网双卡双待识别运营商网络

    检测的代码 private void checkIMSi() {         boolean simStateBySlotIdx = SimUtils.getSimStateBySlotIdx(t ...

  2. android 双卡打电话,Android 6.0 双卡拨号

    相关 api Android 5.0 之前的版本 获取 sim 卡数量 public static boolean isMultiSim(Context context){ boolean resul ...

  3. Android双卡识别IMSI以及副卡发送短信总结

    今日科技快讯 有消息称,许多乐视员工的建行龙卡信用卡额度都被调整为1元,建设银行官方给出的理由为"涉及经济案件".甚至3年前曾服务于乐视的员工,其建行信用卡额度也被调成了1元,这位 ...

  4. 解决 Android 双卡双待识别

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

  5. android人脸识别源代码,Android自带的人脸识别

    1.Android自带的人脸识别Android自带的人脸识别只能识别出人脸在画面中的位置,中点,眼间距,角度等基本特性,提供给拍照性质的应用使用.从基本功能中不能得出明显的特征数据 2.底层库支持ex ...

  6. android 模拟器识别,一种基于符号的识别Android应用运行在模拟器中的方法与流程...

    本发明涉及一种基于符号的识别android应用运行在模拟器中的方法. 背景技术: 很多的移动应用都会使用一种基于lbs的地理围栏的技术(如移动打卡),某些用户为了突破这种围栏的限制,将移动应用运行在模 ...

  7. 将tensorflow训练好的模型移植到Android (MNIST手写数字识别)

    将tensorflow训练好的模型移植到Android (MNIST手写数字识别) [尊重原创,转载请注明出处]https://blog.csdn.net/guyuealian/article/det ...

  8. Android开发之虹软人脸识别活体检测基本步骤

    首先,我简单说下虹软的人脸识别基本步骤: 1.你的设置好设置视频模式方向用于人脸检测 有如下几个可设置方向 //设置视频模式全方向人脸检测ConfigUtil.setFtOrient(this, Fa ...

  9. 百度OCR文字识别-Android安全校验

    百度OCR文字识别-Android安全校验 本文转载自好基友upuptop:https://blog.csdn.net/pyfysf/article/details/86438769 效果图: 如下为 ...

  10. android人脸情绪识别器,基于Android平台的人脸表情识别系统的设计与实现

    摘要: 随着目前移动设备硬件技术的不断发展,其性能与PC的差距越来越小,这使得在嵌入式平台上进行图像处理成为了可能.目前使用最广泛的是基于Android系统的嵌入式平台,与之相关的图像类应用需求也渐渐 ...

最新文章

  1. VC实现微秒(十万分之一秒)休眠
  2. 打字机已经被计算机所取代用英语,无法被电脑所取代的职业
  3. Spring对java模块化支持_Spring项目对JDBC的支持和基本使用
  4. 操作系统实验以及课程设计
  5. 语言怎么得到直流电压并采样_交流电AC如何转换成直流电DC?
  6. Ajax实现动态及时刷新表格数据
  7. win10编辑js文件报错,错误','
  8. 面试系列第1篇:常见面试题和面试套路有哪些?
  9. 流程图怎么切换_PPT中「较长的流程图」该如何清晰展现?
  10. 转载--程序员最喜欢的技术书大都出自这 20 家出版社
  11. 小米手机linux驱动下载,小米手机驱动下载
  12. windows系统ftp服务器,Windows下使用的FTP服务器软件
  13. 一键刷入twrp_红米Note8Pro最简单一键获取ROOT权限教程-管理自启更省电
  14. Minecraft 1.18.1、1.18.2模组开发 19.拼图结构建筑(JigSaw Structure)
  15. win7做服务器性能如何,win7如何做服务器配置
  16. 学弟教程-Python-Flask设置允许跨域
  17. dp在约会上是什么意思_饭圈用语dp是什么意思什么梗? 饭圈为什么喜欢用缩写?...
  18. ubuntu命令行fdisk扩展分区
  19. c语言中指数形式怎么表示_C语言编程基础知识汇总学习,适合初学者!
  20. jquery操作样式

热门文章

  1. LPSTR、LPCSTR、LPTSTR和LPCTSTR的意义及区别
  2. 把指定长度字符串转换成数字
  3. 2009年十大网络流行语英文版
  4. 基于Spring+SpringMVC+MyBatis的汽车配件维修系统
  5. word中录入打钩方框——设计调查问卷必备技能
  6. abab的四字成语_abab的四字词语大全
  7. 叮咚音响登录显示未连接服务器,音响唤醒及蓝牙连接 - 叮咚智能音箱联网教程_叮咚智能音箱联不上网解决办法...
  8. Google黑科技:USB Accelerator —— EDGE TPU CORROCESSOR
  9. Memory in Memory(MIM)时空序列预测学习总结
  10. Windows2008R2 启用TLS 1.2