public static String getImsi(Context context) {String imsi = "";try { //普通方法获取imsiTelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);imsi = tm.getSubscriberId();if (imsi==null || "".equals(imsi)) imsi = tm.getSimOperator();Class<?>[] resources = new Class<?>[] {int.class};Integer resourcesId = new Integer(1);if (imsi==null || "".equals(imsi)) {try { //利用反射获取 MTK手机Method addMethod = tm.getClass().getDeclaredMethod("getSubscriberIdGemini", resources);addMethod.setAccessible(true);imsi = (String) addMethod.invoke(tm, resourcesId);} catch (Exception e) {imsi = null;}}if (imsi==null || "".equals(imsi)) {try { //利用反射获取 展讯手机Class<?> c = Class.forName("com.android.internal.telephony.PhoneFactory");Method m = c.getMethod("getServiceName", String.class, int.class);String spreadTmService = (String) m.invoke(c, Context.TELEPHONY_SERVICE, 1);TelephonyManager tm1 = (TelephonyManager) context.getSystemService(spreadTmService);imsi = tm1.getSubscriberId();} catch (Exception e) {imsi = null;}}if (imsi==null || "".equals(imsi)) {try { //利用反射获取 高通手机Method addMethod2 = tm.getClass().getDeclaredMethod("getSimSerialNumber", resources);addMethod2.setAccessible(true);imsi = (String) addMethod2.invoke(tm, resourcesId);} catch (Exception e) {imsi = null;}}if (imsi==null || "".equals(imsi)) {imsi = "000000";}return imsi;} catch (Exception e) {return "000000";}}
此方法一般都能够获取到IMSI 无高通手机没有亲测
MTK 和展讯手机亲测可行
一般放在卡1的SIM卡 普通方法即可获取
卡2的SIM卡 一般需利用反射来获取
不同芯片的手机底层的方法也不一样
可能经过深度定制的手机无法获取到