Android 获取多卡手机的IMSI

Android SDK默认仅提供单卡信息获取,对于双卡设备,需通过CPU内核接口来获取另一张SIM卡的IMSI。本文介绍如何使用反射技术调用内核方法,以实现双卡手机中第二张SIM卡的IMSI信息获取。

android sdk只提供了对单卡信息的获取,不支持获取双卡的信息,而现在世面上的安卓手机大多是支持双卡的,对应另一张卡信息的获取只能通过cpu内核的方法获取,通过反射获取cpu内置的方法获取sim卡信息。


//普通方法获取imsi
    TelephonyManager tm = (TelephonyManager) context.
            getSystemService(Context.TELEPHONY_SERVICE);
	String imsi = tm.getSubscriberId();
 
下面获取高通和MTK双卡信息的方法,单步调试拿出来的方法微笑
实验了下,能获取大部分的手双卡手机的IMSi,其它信息获取也类似,自行查看源码。
 
/*获取多卡手机imsi*/
    public static List<String> getImsis(Context context) {
        String imsi = null;
        List<String> imsiList = new ArrayList<>();
        try {   //普通方法获取imsi
            TelephonyManager tm = (TelephonyManager) context.
                    getSystemService(Context.TELEPHONY_SERVICE);
            if (tm.getSubscriberId() != null)
                imsiList.add(tm.getSubscriberId());
//            imsi = null;
            Class<?>[] resources = new Class<?>[]{int.class};
            try {   //利用反射获取    MTK手机
                Method addMethod = tm.getClass().getDeclaredMethod("getSubscriberIdGemini", resources);
                addMethod.setAccessible(true);
                imsiList = getImsis(addMethod, tm, imsiList);
                return imsiList;
            } catch (Exception e) {
//                imsi = null;
            }


            try {   //利用反射获取    高通手机
                Method addMethod2 = tm.getClass().getDeclaredMethod("getSubscriberId", resources);
                addMethod2.setAccessible(true);
                imsiList = getImsis(addMethod2, tm, imsiList);
                return imsiList;
            } catch (Exception e) {
            }

            return imsiList;
        } catch (Exception e) {
            return imsiList;
        }
    }

    private static List<String> getImsis(Method method, TelephonyManager tm, List<String> list) throws Exception {
        List<String> stringList = new ArrayList<>();
        stringList.addAll(list);
        for (int i = 1; i < 4; i++) {
            /*检查13卡位imsi,不重复就添加,可以获取不止双卡手机信息*/
            String ii = (String) method.invoke(tm, new Integer(i));
            if (!TextUtils.isEmpty(ii) && !stringList.contains(ii)) {
                stringList.add(ii);
            }
        }
        return stringList;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值