android 双卡识别,Android 双卡双待识别
简介
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 双卡双待识别相关推荐
- android实现异网双卡双待识别运营商网络
检测的代码 private void checkIMSi() { boolean simStateBySlotIdx = SimUtils.getSimStateBySlotIdx(t ...
- android 双卡打电话,Android 6.0 双卡拨号
相关 api Android 5.0 之前的版本 获取 sim 卡数量 public static boolean isMultiSim(Context context){ boolean resul ...
- Android双卡识别IMSI以及副卡发送短信总结
今日科技快讯 有消息称,许多乐视员工的建行龙卡信用卡额度都被调整为1元,建设银行官方给出的理由为"涉及经济案件".甚至3年前曾服务于乐视的员工,其建行信用卡额度也被调成了1元,这位 ...
- 解决 Android 双卡双待识别
Android开发的问题 其实很好狠.今天看到一篇解决android 机型 双卡 管理的问题.看到一篇比较好的文章就转载过来了 = = 转载:http://blog.csdn.net/banketre ...
- android人脸识别源代码,Android自带的人脸识别
1.Android自带的人脸识别Android自带的人脸识别只能识别出人脸在画面中的位置,中点,眼间距,角度等基本特性,提供给拍照性质的应用使用.从基本功能中不能得出明显的特征数据 2.底层库支持ex ...
- android 模拟器识别,一种基于符号的识别Android应用运行在模拟器中的方法与流程...
本发明涉及一种基于符号的识别android应用运行在模拟器中的方法. 背景技术: 很多的移动应用都会使用一种基于lbs的地理围栏的技术(如移动打卡),某些用户为了突破这种围栏的限制,将移动应用运行在模 ...
- 将tensorflow训练好的模型移植到Android (MNIST手写数字识别)
将tensorflow训练好的模型移植到Android (MNIST手写数字识别) [尊重原创,转载请注明出处]https://blog.csdn.net/guyuealian/article/det ...
- Android开发之虹软人脸识别活体检测基本步骤
首先,我简单说下虹软的人脸识别基本步骤: 1.你的设置好设置视频模式方向用于人脸检测 有如下几个可设置方向 //设置视频模式全方向人脸检测ConfigUtil.setFtOrient(this, Fa ...
- 百度OCR文字识别-Android安全校验
百度OCR文字识别-Android安全校验 本文转载自好基友upuptop:https://blog.csdn.net/pyfysf/article/details/86438769 效果图: 如下为 ...
- android人脸情绪识别器,基于Android平台的人脸表情识别系统的设计与实现
摘要: 随着目前移动设备硬件技术的不断发展,其性能与PC的差距越来越小,这使得在嵌入式平台上进行图像处理成为了可能.目前使用最广泛的是基于Android系统的嵌入式平台,与之相关的图像类应用需求也渐渐 ...
最新文章
- VC实现微秒(十万分之一秒)休眠
- 打字机已经被计算机所取代用英语,无法被电脑所取代的职业
- Spring对java模块化支持_Spring项目对JDBC的支持和基本使用
- 操作系统实验以及课程设计
- 语言怎么得到直流电压并采样_交流电AC如何转换成直流电DC?
- Ajax实现动态及时刷新表格数据
- win10编辑js文件报错,错误','
- 面试系列第1篇:常见面试题和面试套路有哪些?
- 流程图怎么切换_PPT中「较长的流程图」该如何清晰展现?
- 转载--程序员最喜欢的技术书大都出自这 20 家出版社
- 小米手机linux驱动下载,小米手机驱动下载
- windows系统ftp服务器,Windows下使用的FTP服务器软件
- 一键刷入twrp_红米Note8Pro最简单一键获取ROOT权限教程-管理自启更省电
- Minecraft 1.18.1、1.18.2模组开发 19.拼图结构建筑(JigSaw Structure)
- win7做服务器性能如何,win7如何做服务器配置
- 学弟教程-Python-Flask设置允许跨域
- dp在约会上是什么意思_饭圈用语dp是什么意思什么梗? 饭圈为什么喜欢用缩写?...
- ubuntu命令行fdisk扩展分区
- c语言中指数形式怎么表示_C语言编程基础知识汇总学习,适合初学者!
- jquery操作样式
热门文章
- LPSTR、LPCSTR、LPTSTR和LPCTSTR的意义及区别
- 把指定长度字符串转换成数字
- 2009年十大网络流行语英文版
- 基于Spring+SpringMVC+MyBatis的汽车配件维修系统
- word中录入打钩方框——设计调查问卷必备技能
- abab的四字成语_abab的四字词语大全
- 叮咚音响登录显示未连接服务器,音响唤醒及蓝牙连接 - 叮咚智能音箱联网教程_叮咚智能音箱联不上网解决办法...
- Google黑科技:USB Accelerator —— EDGE TPU CORROCESSOR
- Memory in Memory(MIM)时空序列预测学习总结
- Windows2008R2 启用TLS 1.2