目前国内对于双卡智能手机的需求还是很大的,各种复杂的业务会涉及到双卡模块;而android标准的api又不提供对双卡的支持。导致国内双卡模块标准混乱,各个厂商各玩各的。目前我知道的双卡解决方案就有:mtk,展讯,高通,broadcom等。
由于公司业务需要,必须要对双卡手机获取各自的imei,imsi,所以也做了一些研究:
首先是最为应用广泛的mtk平台,国内山寨手机以及一些低端品牌双卡都是做的mtk的双卡解决方案
private static void initMtkDoubleSim() { try { TelephonyManager tm = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE); Class<?> c = Class.forName("com.android.internal.telephony.Phone"); Field fields1 = c.getField("GEMINI_SIM_1"); fields1.setAccessible(true); simId_1 = (Integer) fields1.get(null); Field fields2 = c.getField("GEMINI_SIM_2"); fields2.setAccessible(true); simId_2 = (Integer) fields2.get(null); Method m = TelephonyManager.class.getDeclaredMethod( "getSubscriberIdGemini", int.class); imsi_1 = (String) m.invoke(tm, simId_1); imsi_2 = (String) m.invoke(tm, simId_2); Method m1 = TelephonyManager.class.getDeclaredMethod( "getDeviceIdGemini", int.class); imei_1 = (String) m1.invoke(tm, simId_1); imei_2 = (String) m1.invoke(tm, simId_2); Method mx = TelephonyManager.class.getDeclaredMethod( "getPhoneTypeGemini", int.class); phoneType_1 = (Integer) mx.invoke(tm, simId_1); phoneType_2 = (Integer) mx.invoke(tm, simId_2); if (TextUtils.isEmpty(imsi_1) && (!TextUtils.isEmpty(imsi_2))) { defaultImsi = imsi_2; } if (TextUtils.isEmpty(imsi_2) && (!TextUtils.isEmpty(imsi_1))) { defaultImsi = imsi_1; } } catch (Exception e) { isMtkDoubleSim = false; return; } isMtkDoubleSim = true; }
可见,在TelephonyManager中提供了**Gemini的方法,可以用反射很方便地获取到相应的信息。
还有
private static void initMtkSecondDoubleSim() { try { TelephonyManager tm = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE); Class<?> c = Class.forName("com.android.internal.telephony.Phone"); Field fields1 = c.getField("GEMINI_SIM_1"); fields1.setAccessible(true); simId_1 = (Integer) fields1.get(null); Field fields2 = c.getField("GEMINI_SIM_2"); fields2.setAccessible(true); simId_2 = (Integer) fields2.get(null); Method mx = TelephonyManager.class.getMethod("getDefault", int.class); TelephonyManager tm1 = (TelephonyManager) mx.invoke(tm, simId_1); TelephonyManager tm2 = (TelephonyManager) mx.invoke(tm, simId_2); imsi_1 = tm1.getSubscriberId(); imsi_2 = tm2.getSubscriberId(); imei_1 = tm1.getDeviceId(); imei_2 = tm2.getDeviceId(); phoneType_1 = tm1.getPhoneType(); phoneType_2 = tm2.getPhoneType(); if (TextUtils.isEmpty(imsi_1) && (!TextUtils.isEmpty(imsi_2))) { defaultImsi = imsi_2; } if (TextUtils.isEmpty(imsi_2) && (!TextUtils.isEmpty(imsi_1))) { defaultImsi = imsi_1; } } catch (Exception e) { isMtkSecondDoubleSim = false; return; } isMtkSecondDoubleSim = true; }
看样子有似乎也是属于mtk平台的解决方案,因为都有GEMINI_SIM_1属性,这种双卡方案只在联想278t上发现过;有两个TelephonyManager实例,根据getDefault方法获取
下面是展讯平台的(貌似市面上手机不多啊):
private static void initSpreadDoubleSim() { try { Class<?> c = Class .forName("com.android.internal.telephony.PhoneFactory"); Method m = c.getMethod("getServiceName", String.class, int.class); spreadTmService = (String) m .invoke(c, Context.TELEPHONY_SERVICE, 1); TelephonyManager tm = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE); imsi_1 = tm.getSubscriberId(); imei_1 = tm.getDeviceId(); phoneType_1 = tm.getPhoneType(); TelephonyManager tm1 = (TelephonyManager) mContext.getSystemService(spreadTmService); imsi_2 = tm1.getSubscriberId(); imei_2 = tm1.getDeviceId(); phoneType_2 = tm1.getPhoneType(); if (TextUtils.isEmpty(imsi_1) && (!TextUtils.isEmpty(imsi_2))) { defaultImsi = imsi_2; } if (TextUtils.isEmpty(imsi_2) && (!TextUtils.isEmpty(imsi_1))) { defaultImsi = imsi_1; } } catch (Exception e) { isSpreadDoubleSim = false; return; } isSpreadDoubleSim = true; }
这个没有展讯sdk的话还是很难找的吧?
下面是高通的:(貌似高通做的不咋的有些接口没有双卡实现啊)
public static void initQualcommDoubleSim() { try { TelephonyManager tm = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE); Class<?> cx = Class .forName("android.telephony.MSimTelephonyManager"); Object obj =mContext.getSystemService( "phone_msim"); simId_1 = 0; simId_2 = 1; Method mx = cx.getMethod("getDataState"); // int stateimei_1 = (Integer) mx.invoke(cx.newInstance()); int stateimei_2 = tm.getDataState(); Method mde = cx.getMethod("getDefault"); Method md = cx.getMethod("getDeviceId", int.class); Method ms = cx.getMethod("getSubscriberId", int.class); Method mp = cx.getMethod("getPhoneType"); // Object obj = mde.invoke(cx); imei_1 = (String) md.invoke(obj, simId_1); imei_2 = (String) md.invoke(obj, simId_2); imsi_1 = (String) ms.invoke(obj, simId_1); imsi_2 = (String) ms.invoke(obj, simId_2); int statephoneType_1 = tm.getDataState(); int statephoneType_2 = (Integer) mx.invoke(obj); Log.e("tag", statephoneType_1 + "---" + statephoneType_2); // Class<?> msc = Class.forName("android.telephony.MSimSmsManager"); // for (Method m : msc.getMethods()) { // if (m.getName().equals("sendTextMessage")) { // m.getParameterTypes(); // } // Log.e("tag", m.getName()); // } } catch (Exception e) { isQualcommDoubleSim = false; return; } isQualcommDoubleSim = true; }
getPhoneType&getDataState 方法看了底层发现没有双卡实现,目前也不知道该咋办...
未完待续....
相关推荐
Android 平台获取手机 IMSI、IMEI、序列号和手机号的方法 Android 操作系统提供了多种方法来获取手机的 IMSI、IMEI、序列号和手机号,这些信息对于移动应用程序的开发和维护非常重要。本文将详细介绍 Android 平台...
在Android系统中,IMSI(International Mobile Subscriber Identity)和IMEI(International Mobile Equipment Identity)是两个重要的标识符,用于区分不同的移动设备和用户。本文将深入探讨如何在Android平台上...
在Android系统中,IMEI(International Mobile Equipment Identity)和IMSI(International Mobile Subscriber Identity)是两个重要的标识符,它们在移动通信中起着至关重要的作用。IMEI是设备的唯一标识,而IMSI则...
双卡双待手机, 获取IMSI 使用了反射,兼容mtk展讯高通不同的芯片 一般手机都能够获取成功 没有高通手机,所以高通的没有亲测 谁测通了评论中回复一下哦
本文将详细探讨如何在支持双卡功能的手机上获取国际移动用户识别码(IMSI),并重点讨论如何确保这一过程在不同手机芯片,如联发科(Mediatek)和高通(Qualcomm)等之间实现兼容。 首先,IMSI是每个移动通信设备在...
Android平台获取手机IMSI、IMEI、序列号及手机号的用法 在 Android 平台中,获取手机的 IMSI、IMEI、序列号及手机号是非常重要的,以下将详细介绍如何获取这些信息。 1. 获取运营商 SIM 卡 IMSI 号 使用 `android...
在C#中获取IMEI主要针对Windows Phone和使用Xamarin或.NET MAUI的Android平台,而获取IMSI则涉及更高级别的权限和隐私考虑,一般不推荐直接获取。在实际应用中,应遵循最小权限原则,尊重并保护用户隐私。同时,注意...
Android 获取双卡手机IMEI 的方法示例 在 Android 开发中,获取双卡手机的IMEI是一件很重要的事情,IMEI 是移动终端设备的唯一标识符。常见的获取IMEI的方法是使用 TelephonyManager 的 getDeviceId() 方法,但是这...
在移动通信领域,IMEI...总的来说,通过VC++读取手机的IMEI和IMSI涉及了底层通信协议的理解、API的使用以及权限管理等多方面的知识。在开发过程中,需要注意遵循相关的规范和标准,同时考虑到隐私保护和安全问题。
在Android系统中,获取和显示手机号码、IMEI(国际移动设备识别码)以及IMSI(国际移动用户识别码)是常见的需求,这些信息对于设备管理和应用开发具有重要作用。下面将详细阐述这些概念以及如何在Android中获取它们...
本文将详细介绍如何在Android应用中获取IMSI(国际移动用户识别码)、IMEI(国际移动设备识别码)、MAC地址、IP地址、当前时间、经纬度以及网络类型。 首先,让我们了解这些概念: 1. **IMSI**:IMSI是手机用户在...
以下是一些关于如何在WinCE系统中100%正确获取IMEI和IMSI的知识点: 1. **IMEI获取**: - 在WinCE系统中,IMEI通常存储在GSM或UMTS模块的Eeprom中。可以使用AT命令集来查询IMEI,这是标准的串行通信协议,用于与...
Windows Mobile和Android获得IMEI、MEID和IMSI demo Windows Mobile是从别处拿来的, sim5.rar是IMEI、MEID和IMSI demo CallGetDeviceUniqueId是获取window mobile系统UID的另一个方式 Android很浅显,一起共享吧
在Windows Mobile 6.0及更高版本的操作系统中,获取手机设备的国际移动用户识别码(IMSI)和国际移动设备标识(IMEI)是开发者进行设备管理或网络通信功能开发时的重要步骤。这两个标识符在移动通信领域扮演着至关...
接下来,Android提供了`TelephonyManager`类来处理与手机通信相关的任务,其中包括获取IMSI。在Java代码中,你可以这样实现: ```java // 获取TelephonyManager实例 TelephonyManager telephonyManager = ...
IMSI获取 安卓手机IMSI 和IMEI获取,安装后打开即可看到
但是,需要注意的是,直接获取IMSI号可能违反用户隐私政策,所以在实际应用中应谨慎处理。 下面是一个使用TAPI获取SIM信息的示例(非C#,但展示了TAPI的基本用法): ```cpp #include #include int main() { ...
在Android平台上,获取手机用户绑定的手机号码是一个常见的需求,特别是在开发需要用户验证或个性化服务的应用时。然而,由于隐私保护政策和不同运营商的限制,直接获取手机号码并不总是可行的。本文将详细介绍如何...
基于Android10.0的设备上,获取相应的MAC地址,手机IMEI号,手机号,手机MSISDN号,手机ICCID号,进行可行性验证,特别是MAC地址方面,在Android10.0前后的设备均进行相应的接口验证,保证其可用性。适合正在致力于...
以上就是关于Android获取IMEI码的相关知识点,包括使用`TelephonyManager`类获取IMEI,处理权限问题,兼容无SIM卡和多SIM卡设备的情况,以及隐私合规性。在实际开发中,根据具体需求和设备情况灵活运用这些方法。