简介
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";
}
}
}
@Override
public boolean directCall(String paramString, int paramInt) {
……
return false;
}
@Override
public AbsSim detect() {
return super.detect();
}
@Override
public String getSimPhoneNumber(int paramInt) {
return "";
}
@Override
public int getDataState(int paramInt) {
return -1;
}
@Override
public String getIMSI(int paramInt) {
return getIMSI(paramInt, null);
}
@Override
public String getIMSI(int paramInt, Context paramContext) {
return null;
}
@Override
public int getPhoneState(int paramInt) {
return 0;
}
@Override
public boolean isServiceAvaliable(int paramInt) {
return false;
}
@Override
public boolean isSimStateIsReady(int paramInt) {
return false;
}
@Override
public int getSimOperator(int paramInt) { // 注意
return 0;
}
@Override
protected Object getITelephonyMSim(int paramInt) {
if (mTelephonyMSim == null)
mTelephonyMSim = ITelephony.Stub.asInterface(ServiceManager
.getService("phone"));
return mTelephonyMSim;
}
@Override
protected 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);
@Override
public boolean hasSimPhone() {
return false;
}
@Override
public AbsSim detect() {// 根据某些字段判是否为双卡(有可能误判)
return this;
}
@Override
public boolean isDualSimPhone() {
return mIsDualSimPhone;
}
@Override
public int getSimSlotNum() {
return 1;
}
@Override
public String getSimPhoneNumber(int paramInt) {
return ((TelephonyManager) getMSimTelephonyManager(0)).getLine1Number();
}
@Override
public int getDataState(int paramInt) {
return ((TelephonyManager) getMSimTelephonyManager(0)).getDataState();
}
@Override
public String getIMSI(int paramInt) {
return ((TelephonyManager) getMSimTelephonyManager(0)).getDeviceId();
}
@Override
public String getIMSI(int paramInt, Context paramContext) {
return ((TelephonyManager) getMSimTelephonyManager(0))
.getSubscriberId();
}
@Override
public int getPhoneState(int paramInt) {
return ((TelephonyManager) getMSimTelephonyManager(0)).getCallState();
}
@Override
public boolean isServiceAvaliable(int paramInt) {
return false;
}
@Override
public boolean isSimStateIsReady(int paramInt) {
return ((TelephonyManager) getMSimTelephonyManager(0)).getSimState() == 5;
}
@Override
public int getSimOperator(int paramInt) {
TelephonyManager localTelephonyManager = (TelephonyManager) getMSimTelephonyManager(paramInt);
return Integer.parseInt(localTelephonyManager.getSimOperator());
}
@Override
protected Object getITelephonyMSim(int paramInt) {
return SimManager.getInstance().getITelephonyByPhone();
}
@Override
protected 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 读取IMSI 和IMEI号支持双卡双待,可以判断双卡双待通过那个卡上网,及读取双卡双待的电话卡的信息
主要给大家介绍了关于Android获取双卡双待手机的卡信息的相关资料,文中通过示例代码介绍的非常详细,对各位Android开发者们具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
APP在普通Android手机上可以达到实时的检测识别效果,CPU(4线程)约30ms左右,GPU约25ms左右 更多项目《面部表情识别》系列文章请参考: 1.面部表情识别1:表情识别数据集(含下载链接):...
Android平台人脸识别源代码
Android原生人脸识别,包含Camera和Camera2两种实现方法
Android 安卓图像识别技术识别麻将源码Demo APP,识别效果非常不错! 没有源码,源码太大,下载可以安装APP,可以看麻将识别效果视频,请安卓测试,源码和没有积分下载的联系点我头像联络我。
Android调用摄像头实时图片识别对比,可用于开发人脸识别等功能
Android可以识别和扫描二维码,但是识别字符串呢? google提供了以下解决方案用的是原来HP的相关资料。 可以吧,这个迁移到Android上。 工程导入成功是可以正常运行的,我是专门换了个电脑重新验证了下。 如果有不能...
添加库,在app登录界面使用指纹识别模块实现指纹登陆
基于Android的人脸识别考勤系统源码.zip基于Android的人脸识别考勤系统源码.zip基于Android的人脸识别考勤系统源码.zip基于Android的人脸识别考勤系统源码.zip基于Android的人脸识别考勤系统源码.zip基于Android的...
可以识别 市面上95% 的android 手机,识别成功之后,自动判断是否安装驱动,如果安装驱动则可以连接上手机,获取手机的桌面以及手机号码。由于没有自动下载安装驱动的功能,所以如果没有安装驱动的话需要自己下载...
Android人脸识别源码——详细代码解释
android原生人脸识别demo camera2
Android Camera 内置人脸识别的Demo
android触屏手势识别
Android+OpenCV+人脸识别源码(完整)Android系统调用opencv实现人体识别。可以实现多个人脸的识别
Android银行卡识别demo
androidstudio拍照与人脸识别,使用Androidstudio工具打开dome,Android自带类库,无第三方类库。
Android 6.0指纹识别App
Android开发安卓大作业人脸识别签到系统源码Android开发安卓大作业人脸识别签到系统源码Android开发安卓大作业人脸识别签到系统源码Android开发安卓大作业人脸识别签到系统源码Android开发安卓大作业人脸识别签到...