Android 双卡双待识别
简介
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) {
- <span style="white-space:pre"> </span>……
- 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。
转: http://blog.csdn.net/banketree/article/details/24306493
Android 双卡双待识别的更多相关文章
- ubuntu创建wifi热点(android可识别)亲测可用
转自http://jingyan.baidu.com/article/ea24bc39b03fc6da62b331f0.html 如何在ubuntu系统下创建android可识别热点?一般环境下创建的 ...
- Android 人脸识别
Android人脸识别技术,可以参考下面的网站. http://www.faceplusplus.com.cn/ 本项目使用的就是该网站的api. 项目具体使用的技术代码 /** * 用来压缩图片的方 ...
- android指纹识别、拼图游戏、仿MIUI长截屏、bilibili最美创意等源码
Android精选源码 一个动画效果的播放控件,播放,暂停,停止之间的动画 用 RxJava 实现 Android 指纹识别代码 Android仿滴滴打车(滴滴UI)源码 Android高仿哔哩哔哩动 ...
- Android指纹识别
原文:Android指纹识别 上一篇讲了通过FingerprintManager验证手机是否支持指纹识别,以及是否录入了指纹,这里进行指纹的验证. //获取FingerprintManager实例 F ...
- Android指纹识别深入浅出分析到实战(6.0以下系统适配方案)
指纹识别这个名词听起来并不陌生,但是实际开发过程中用得并不多.Google从Android6.0(api23)开始才提供标准指纹识别支持,并对外提供指纹识别相关的接口.本文除了能适配6.0及以上系统, ...
- 腾讯优测干货精选|Android双卡双待适配——隐藏在数据库中的那些秘密
腾讯优测是专业的app自动化测试平台,除了提供兼容性测试,远程真机租用等多维度的测试服务,还有优分享-腾讯内部的移动研发测试干货精选~ 许多APP都希望获取用户通讯录联系人,利用通讯录关系链信息来丰富 ...
- Android ocr识别文字介绍(文字识别)
最近在做身份证号码识别,在网上搜索的一番后发现目前开源的OCR中tesseract-ocr算是比较强大的了,它由HP于1985年到1995年间开发,后来由google直接负责,经过谷歌进一步开发后,目 ...
- 集成Android人脸识别demo分享
本应用来源于虹软人工智能开放平台,人脸识别技术工程如何使用? 1.下载代码 git clone https://github.com/andyxm/ArcFaceDemo.git 2.下载虹软人脸识别 ...
- Android人脸识别Demo竖屏YUV方向调整和图片保存
本博客包含三个常用方法,用于盛开Android版人脸识别Demo中竖屏使用时送入yuv数据,但一直无法识别的情况. 1.首先可以尝试顺时针旋转90°或270°,然后送入识别SDK. 2.旋转方向后依然 ...
随机推荐
- C#学习链接
.NET Framework — 针对 .NET 构建企业级搜索:https://msdn.microsoft.com/zh-cn/magazine/dn904674.aspx .net 动态编译:h ...
- struts标签内容截取
<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%> <% ...
- Marquee 滚动参数
new marquee("Layer3", 2, 1, 989, 68, 20, 0, 0, 238); 参数说明:Layer3 :容器ID 2 :向上滚动(0向上 1向下 2向左 ...
- 基于浏览器的HTML5地理定位
基于浏览器的HTML5地理定位 地理位置(Geolocation)是 HTML5 的重要特性之一,提供了确定用户位置的功能,借助这个特性能够开发基于位置信息的应用.今天这篇文章向大家介绍一下 HTML ...
- 1.1ASP.NET Web API 2入门
HTTP 不只是为了生成 web 页面.它也是建立公开服务和数据的 Api 的强大平台.HTTP 是简单的. 灵活的和无处不在.你能想到的几乎任何平台有 HTTP 库,因此,HTTP 服务可以达到范围 ...
- HTML文档、javascript脚本的加载与解析
1.onload事件 1.1 onload事件分类 a.文档加载完成事件(包括脚本.图片等资源都加载完),绑定方法:<body onload="doSomething()"& ...
- 服务器监控之 Monitorix 初体验
参考: http://www.tecmint.com/monitorix-a-lightweight-system-and-network-monitoring-tool-for-linux/ Cen ...
- 我常用的Vi命令
Vi对于linux的重要性和受欢迎的程度在此一律不表.此刻互联网上不少介绍vi的文章和博客,相信写得比我好的也不在少数.然而为什么我依然写这样一篇文章呢?我对linux知识和了解也都来自于互联网,很难 ...
- Memcache 内存分配策略和性能(使用)状态检查
前言: 一直在使用Memcache,但是对其内部的问题,如它内存是怎么样被使用的,使用一段时间后想看看一些状态怎么样?一直都不清楚,查了又忘记,现在整理出该篇文章,方便自己查阅.本文不涉及安装.操作. ...
- Maven下载依赖项的源代码(source code)和Javadoc
Maven 默认只下载依赖项本身的 jar 文件,不下载源代码和 Javadoc.如此固然工程的体积是最小的,但在开发者不熟悉依赖的对象时,需要查找源代码中的方法定义和说明. 这时我们需要使用一条 M ...