zoukankan      html  css  js  c++  java
  • 关于android各种双卡手机获取imei,imsi的处理(mtk,展讯,高通等)

    目前国内对于双卡智能手机的需求还是很大的,各种复杂的业务会涉及到双卡模块;而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 方法看了底层发现没有双卡实现,目前也不知道该咋办...

     

  • 相关阅读:
    ----Vue 单页应用的首屏优化----
    ----小程序之rich-text图片宽度自适应----
    ----vue-router 如何在新窗口打开页面----
    ----element-ui实现时间控件开始时间和结束时间关联----
    ----element-ui自定义表单验证----
    ----js中的every和some----
    「Linux学习」之挂载访问samba服务
    「Linux学习」之samba和nfs共享服务搭建
    「Linux学习」之防火墙服务设置
    「linux学习」之批量创建用户脚本
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/3668296.html
Copyright © 2011-2022 走看看