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++) { /*检查1到3卡位imsi,不重复就添加,可以获取不止双卡手机信息*/ String ii = (String) method.invoke(tm, new Integer(i)); if (!TextUtils.isEmpty(ii) && !stringList.contains(ii)) { stringList.add(ii); } } return stringList; }