博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 双卡双待识别
阅读量:7079 次
发布时间:2019-06-28

本文共 5177 字,大约阅读时间需要 17 分钟。

简单介绍

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
mSimSlots = new ArrayList
(); 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
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。

你可能感兴趣的文章
使用CDN对动态网站内容加速有效果吗
查看>>
iOS -view横向变成竖向
查看>>
控件自定义
查看>>
[LeetCode] Sort Colors
查看>>
Hadoop集群datanode磁盘不均衡的解决方案
查看>>
SQL SERVER 中日期格式化,及GETDATE()、CONVERT()函数使用说明
查看>>
datasnap回调
查看>>
Python文件夹与文件的操作
查看>>
关于INTRAWEB ISAPI DLL发布
查看>>
解决ASP.NET MVC4中使用Html.DropDownListFor显示枚举值默认项问题
查看>>
数据挖掘10大算法介绍
查看>>
Kaggle 商品销量预测季军方案出炉,应对时间序列问题有何妙招
查看>>
《程序员的修炼——从优秀到卓越》
查看>>
使用.net开发手机管理软件 (十) 短信部分——VB.NET解码PDU
查看>>
sql2005 COM+ 目录要求 (警告)
查看>>
恋恋风尘
查看>>
mongodb - collMod
查看>>
学生如何提高专业英文阅读能力--施一公教授
查看>>
回顾2011,展望2012
查看>>
Android实例RSS客户端开发(3)--rss列表并显示在ui上
查看>>