折腾:
【未解决】安卓10的小米9中中国移动手机号的SIM的MSIN是什么
期间,通过adb命令获取不到IMSI
参考帖子去试试代码获取:
另外看到:
TelephonyManager.getSimOperator(): 46009 // 当前流量卡,联通 TelephonyManager.getSimOperatorName(): CMCC // 联通 TelephonyManager.getNetworkOperator(): 46000 // 移动,卡一 TelephonyManager.getNetworkOperatorName(): CHINA MOBILE // 移动 TelephonyManager.getSubscriberId(): 46002326951xxxx // 移动,这就是 IMSI,xxxx 部分是由我隐去的 Operator name: 联通
别人用
TelephonyManager.getSubscriberId()
可以获取到对应的
46002326951xxxx
就是:
IMSI
其中最后10位就是:MSIN
抽空去试试:
把相关代码
TelephonyManager.getSubscriberId()
加到此处rcsjta中,看看能否直接获取到 小米9的IMSI
android IMSI 获取
/** * 获取手机IMSI */ public static String getIMSI(Context context){ try { TelephonyManager telephonyManager=(TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); //获取IMSI号 String imsi=telephonyManager.getSubscriberId(); if(null==imsi){ imsi=""; } return imsi; } catch (Exception e) { e.printStackTrace(); return ""; } }
和之前代码一样
/** * 反射获取 getSubscriberId ,既imsi * * @param subId * @return */ public static String getSubscriberId(int subId) { TelephonyManager telephonyManager = (TelephonyManager) App.getInstance().getSystemService(TELEPHONY_SERVICE);// 取得相关系统服务 Class<?> telephonyManagerClass = null; String imsi = null; try { telephonyManagerClass = Class.forName("android.telephony.TelephonyManager"); if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.LOLLIPOP) { Method method = telephonyManagerClass.getMethod("getSubscriberId", int.class); imsi = (String) method.invoke(telephonyManager, subId); } else if (android.os.Build.VERSION.SDK_INT == android.os.Build.VERSION_CODES.LOLLIPOP) { Method method = telephonyManagerClass.getMethod("getSubscriberId", long.class); imsi = (String) method.invoke(telephonyManager, (long) subId); } } catch (Exception e) { e.printStackTrace(); } Log.i(App.TAG, "IMSI==" + imsi); return imsi; } /** * 反射获取 getSubscriptionId ,既 subid * * @param slotId 卡槽位置(0,1) * @return */ public static int getSubscriptionId(int slotId) { try { Method datamethod; int setsubid = -1;//定义要设置为默认数据网络的subid //获取默认数据网络subid getDefaultDataSubId Class<?> SubscriptionManager = Class.forName("android.telephony.SubscriptionManager"); if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) { // >= 24 7.0 datamethod = SubscriptionManager.getDeclaredMethod("getDefaultDataSubscriptionId"); } else { datamethod = SubscriptionManager.getDeclaredMethod("getDefaultDataSubId"); } datamethod.setAccessible(true); int SubId = (int) datamethod.invoke(SubscriptionManager); Method subManagermethod = SubscriptionManager.getDeclaredMethod("from", Context.class); subManagermethod.setAccessible(true); Object subManager = subManagermethod.invoke(SubscriptionManager, App.getInstance()); //getActiveSubscriptionInfoForSimSlotIndex //获取卡槽0或者卡槽1 可用的subid Method getActivemethod = SubscriptionManager.getDeclaredMethod("getActiveSubscriptionInfoForSimSlotIndex", int.class); getActivemethod.setAccessible(true); Object msubInfo = getActivemethod.invoke(subManager, slotId); //getSubscriptionId Class<?> SubInfo = Class.forName("android.telephony.SubscriptionInfo"); //slot0 获取卡槽0的subid int subid = -1; if (msubInfo != null) { Method getSubId0 = SubInfo.getMethod("getSubscriptionId"); getSubId0.setAccessible(true); subid = (int) getSubId0.invoke(msubInfo); } Log.i(App.TAG, "slotId=" + slotId + ", subid=" + subid); return subid; } catch (Exception e) { Log.e(App.TAG, e.getLocalizedMessage()); } return -1; } /** * 获取运营商 IMSI * 默认为 IMEI1对应的 IMSI * * @return */ public static String getSimOperator() { TelephonyManager telephonyManager = (TelephonyManager) App.getInstance().getSystemService(TELEPHONY_SERVICE);// 取得相关系统服务 return telephonyManager.getSimOperator(); }
TelephonyManager telephonyManager = (TelephonyManager) this .getSystemService(TELEPHONY_SERVICE);// 取得相关系统服务 String imsi = telephonyManager.getSubscriberId(); //取出 IMSI
算了,去加代码试试
写了代码:
import android.telephony.TelephonyManager; TelephonyManager telephonyManager = (TelephonyManager) App.getInstance().getSystemService(TELEPHONY_SERVICE);// 取得相关系统服务 String imsi = telephonyManager.getSubscriberId(); sLogger.debug("IMSI=".concat(imsi));
有错误提示:

另外还发现
app红色报错
参考
的
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
去试了换context
TelephonyManager telephonyManager = (TelephonyManager) context.getInstance().getSystemService(TELEPHONY_SERVICE);// 取得相关系统服务
问题依旧

参考:
换this试试
TelephonyManager telephonyManager = (TelephonyManager) this .getSystemService(TELEPHONY_SERVICE);// 取得相关系统服务
貌似不报错了。
再继续解决后面的错误
进入getSubscriberId的定义
/Users/xxx/Library/Android/sdk/sources/android-26/android/telephony/TelephonyManager.java
/** * Returns the unique subscriber ID, for example, the IMSI for a GSM phone. * Return null if it is unavailable. */ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getSubscriberId() { return getSubscriberId(getSubId()); }

可以看到,需要添加权限
所以去加上:
/RCS/rcsjta/core/AndroidManifest.xml
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
发现之前已有此权限了

不用额外添加了。

试试 add permissions check
自动加了判断代码:
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions, and then overriding // public void onRequestPermissionsResult(int requestCode, String[] permissions, // int[] grantResults) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. return; } String imsi = telephonyManager.getSubscriberId();
此处代码是:
// TelephonyManager telephonyManager = (TelephonyManager) App.getInstance().getSystemService(TELEPHONY_SERVICE);// 取得相关系统服务 // TelephonyManager telephonyManager = (TelephonyManager) context.getInstance().getSystemService(TELEPHONY_SERVICE);// 取得相关系统服务 TelephonyManager telephonyManager = (TelephonyManager) this .getSystemService(TELEPHONY_SERVICE);// 取得相关系统服务 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions, and then overriding // public void onRequestPermissionsResult(int requestCode, String[] permissions, // int[] grantResults) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. return; } String imsi = telephonyManager.getSubscriberId(); sLogger.debug("IMSI=".concat(imsi));
去调试看看:
能否获取到
不过另外看到了
”Android中设备唯一码有很多,如:MAC地址、IMEI号(DeviceId)、IMSI号、ANDROID_ID、序列号(SerialNumber)等,
但并不是所有设备上都能稳定获取到这些值。“
”权限也都加了,获取还是空。
手机号码不是所有的都能获取。只是有一部分可以拿到。这个是由于移动运营商没有把手
机号码的数据写入到sim卡中。sim卡只有唯一的编号,供网络与设备识别那就是imsi号码,手机的信号也可以说是通过这个号码在网络中传递的,并不是手机号码。
试想,你的sim丢失后,补办一张新的会换号码吗? —不会就是因为在你的手机号码对应的 imsi号在移动运营商中被修改成新sim卡的imsi号码。
这个就像是一个变量,当移动运营商为它赋值了,它自然就会有值。不赋值自然为空。“
-》那估计是:
之前adb命令都没获取到
-》就属于:正常现象了
估计此处小米9就没开放这些属性?
那估计代码中也获取不到了。。。

调试发现没权限
那去卸载再重新安装
然后全部允许,或许就有权限了?
重新调试,发现此处代码,在启动之前就允许了
导致还没去弹框允许权限呢。
暂时注释掉
重新运行,确保获取到所有权限
再去加上这段代码来调试看看
不过竟然没弹框申请权限
那么手动去设置添加权限

再调试看看
至少有权限了:

结果:
IMSI依旧是null空

->后记:
还看到了警告提示,可以会是null,抛出null的异常
Using getSubscriberId to get device identifiers is not recommended. Method invocation 'getSubscriberId' may produce 'NullPointerException'

再去试试:
String simOp = telephonyManager.getSimOperator(); sLogger.debug("Sim Operator=".concat(simOp));
以及:
// String imei = telephonyManager.getImei(); String imei = telephonyManager.getDeviceId(); sLogger.debug("IMEI=".concat(imei));
->也看到警告:
Using getDeviceId to get device identifiers is not recommended.

先去运行试试

是可以获取到sim的operator是46002的
而getDeviceId返回的IMEI是null

【总结】
此处通过代码:
import android.telephony.TelephonyManager; // TelephonyManager telephonyManager = (TelephonyManager) App.getInstance().getSystemService(TELEPHONY_SERVICE);// 取得相关系统服务 // TelephonyManager telephonyManager = (TelephonyManager) context.getInstance().getSystemService(TELEPHONY_SERVICE);// 取得相关系统服务 TelephonyManager telephonyManager = (TelephonyManager) this .getSystemService(TELEPHONY_SERVICE);// 取得相关系统服务 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions, and then overriding // public void onRequestPermissionsResult(int requestCode, String[] permissions, // int[] grantResults) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. return; } String imsi = telephonyManager.getSubscriberId(); if (imsi != null) { sLogger.debug("IMSI=".concat(imsi)); } String simOp = telephonyManager.getSimOperator(); sLogger.debug("Sim Operator=".concat(simOp)); // String imei = telephonyManager.getImei(); String imei = telephonyManager.getDeviceId(); if (imei != null) { sLogger.debug("IMEI=".concat(imei)); }
结果:
- IMSI:获取不到,是空null
- IMEI:获取不到,是空null
- SIM的operator:可以获取到,是46002
- 中国移动CMCC
- 参见
- Most up to date list of MCC and MNC codes: mobile country codes – mobile network codes
转载请注明:在路上 » 【无法解决】安卓10的小米9中通过代码获取到IMSI和MSIN