Android 双卡双待识别

简介

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

机制

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

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

实现

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

效果如图:

小米手机 测试效果

华为手机测试效果

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

[cpp] view plaincopy

  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方案:

[cpp] view plaincopy

  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. }

再列举一款单卡的方案:

[cpp] view plaincopy

  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

时间: 2024-10-13 00:54:54

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

Android身份证识别是什么

Android身份证识别应用背景 随着智能终端(智能手机及平板电脑)及移动通信(4G)的发展,人们用手机的概率比用电脑的多,可以预见未来几年60%以上的业务将会逐渐转移到智能终端系统上来.如今手机APP的应用火爆,例如查吃的住的出行的订票的O2O模式,网上支付,移动金融,移动线上订货线下配送等等等,我司也研发出Android身份证识别的应用,让需要实名制的应用更加方便,快捷,提高用户体验,为人们解决繁琐输入的问题. 原来运行在PC上的信息系统(如邮件系统.即时通信.网页浏览.协同办公.网络购物.

ubuntu创建wifi热点(android可识别)

如何在ubuntu系统下创建android可识别热点?一般环境下创建的wifi热点android设备是无法识别的,接下来小编给您讲一讲如何在ubuntu14下创建android可识别的wifi热点 方法: 单机屏幕右上角 流浪状网络按钮,如图,在菜单中选择 编辑(edit) 在打开的窗口中选择 添加(Add),如图 选择创建网络类型为 WIFI,如图 出现如图界面,设置wifi的一般选项,编辑各个选项,Mode选择Ad-hoc,之后便于修改(本实例采用 名称 ubuntu wifi hotspo

Android证件识别系统

标签: 文通Android ***识别读取 驾照识别读取 行驶证识别读取 车辆VIN码识别 护照识别 军官证识别 名片识别 二代证读取 应用背景 随着智能终端(智能手机及平板电脑)及移动 通信(3G)的发展,原来运行在PC上的信息系统(如邮件系统.即时通信.网页浏览.协同办公.网络购物.社交网站.博客等)逐渐转移到智能终端设备上. 可以预见未来几年60%以上的业务将会逐渐转移到智能终端系统上来.在这种背景下,北京文通公司推出基于Android及 iOS平台的证件识别软件. 产品描述 文通证件识别

Android人脸识别技术

Android人脸识别技术用到的底层库:android/external/neven/,framework 层:frameworks/base/media/java/android/media/FaceDetector.java. java层接口的限制: 1.只能接受bitmap的数据. 2.只能识别出双眼睛距离不大于20像素的人脸. 3.只能检测人脸的位置,不能对人脸匹配. 下面代码的运行效果: @Override protected void onCreate(Bundle savedIns

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

Android精选源码 一个动画效果的播放控件,播放,暂停,停止之间的动画 用 RxJava 实现 Android 指纹识别代码 Android仿滴滴打车(滴滴UI)源码 Android高仿哔哩哔哩动画客户端bilibili源码 android八数码拼图游戏源码 高仿最美创意的一款APP视频应用源码 android恋爱管家完整源码 仿miui自动滚动截屏.长截屏功能实现源码 android拼图游戏源码 Android打造不一样的圆盘签到效果 Android简单易用的TextView装饰库 一个超

Android银行卡识别技术介绍与应用

当今社会使用移动支付已经到了火热阶段,出门基本就只需带个手机就能完成支付需求,各行各业都可以使用,比如餐饮.娱乐.商场购物.外出旅行等等方面,传统的现金方式支付已经逐渐被替代.大家都知道,使用移动支付的方式需要绑定银行卡或信用卡,那么手动输入卡号就会让移动支付变得繁琐,如何简化这个繁琐的工作呢?可以使用银行卡识别,利用OCR技术,只需要通过摄像头对准银行卡拍照就能够达到自动录入银行卡上的信息. 银行卡识别,识别银行卡信息之后,可以将识别后的内容分组归类,存入软件系统中.相对于传统手工输入,And

Android行驶证识别

在移动互联网时代来临以前,生活中的一些情况是业务人员在办理汽车相关手续而录入行驶证信息的时候,一比一地手动抄录行驶证上的信息,众所周知包含文字.数字在内的行驶证上的信息有很多,如果手动抄录会出现很多问题,一个数字出错就可能导致整个录入过程失败,而且还需要比对查询.因此有了行驶证识别技术. 让大家来了解一下行驶证图片识别,这也是舒适和便捷的具体体现.行驶证图片识别是什么?肯定会有人开始打上一个大大的问号.它又和舒适便捷有什么关系?以上疑问在下面的文章中都会得到一一解答. 介绍完行驶证图片识别后,接

Android双卡双待编程识别

如今,尤其是在中国,双卡双待如此普及和如此广泛,双卡双待已经成为智能手机的事实上的标准.大势所趋,为此,Android从Android 5.1开始,从Android SDK API层面开始支持双卡双待或1个以上的SIM卡.Android官方的文档阐释链接: https://developer.android.com/about/versions/android-5.1.html#multisim 原文: Multiple SIM Card Support Android 5.1 adds s

Android文字识别之tesseract的使用

关于tesseract识别工具有Google提供的版本有tesseract-android-tools,不过还有一个tesseract-two也是非常好用的,这里我们使用的是tesseract-two.tesseract是用c++实现的,需要封装Java API用于Android平台的调用.所以在使用tesseract-two之前得下载Android-NDK,下载NDK之后,解压到自己电脑的一个文件夹下,配置eclipse引用下来的NDK. 解压下载来的NDK,因为要使用ndk-build该命令