我试图在Android 5.1设备中获得MCC和MNC号码(基本上我想要IMSI号码,但这些也足够了),具有双卡(都是活动的)。由于5.1支持双卡,所以我使用订阅管理器如下:
SubscriptionManager manager = SubscriptionManager.from(this);
List<SubscriptionInfo> sil = manager.getActiveSubscriptionInfoList();
if (sil != null) {
for (SubscriptionInfo subInfo : sil) {
Log.v("TestMain", "SubInfo:" + subInfo);
}
} else {
Log.v("TestMain", "SubInfo: list is null");
}
,得到如下输出:
07-24 18:28:32.162 3844-3844/? V/TestMain﹕ SubInfo:{id=1, mcc 405 mnc 803, iccId=89918030914128062059 simSlotIndex=0 displayName=Aircel Karnataka carrierName=Aircel — Aircel Karnataka nameSource=0}
07-24 18:28:32.162 3844-3844/? V/TestMain﹕ SubInfo:{id=2, mcc 405 mnc 803, iccId=8991860044481968955 simSlotIndex=1 displayName=CARD 2 carrierName=Vodafone Karnataka nameSource=0}
MCC(与在同一国家相同)请注意,跨国公司是相同的,尽管运营商不同。
当我关掉电话时,我在日志记录中看到这行:
07-24 18:31:02.295 616-616/? V/KeyguardUpdateMonitor﹕ SubInfo:{id=1, mcc 405 mnc 803, iccId=89918030914128062059 simSlotIndex=0 displayName=CARD 1 carrierName=Emergency calls only — Aircel Karnataka nameSource=0}
07-24 18:31:02.295 616-616/? V/KeyguardUpdateMonitor﹕ SubInfo:{id=2, mcc 404 mnc 86, iccId=8991860044481968955 simSlotIndex=1 displayName=CARD 2 carrierName=Emergency calls only — Vodafone Karnataka nameSource=0}
正如您所看到的,keyguard应用程序为sim卡获得了MNC的权利。
所以我研究了keyguard应用程序的代码,发现代码与我使用的代码相同来自Android源代码的代码摘自这里:
protected void handleSimSubscriptionInfoChanged() {
if (DEBUG_SIM_STATES) {
Log.v(TAG, "onSubscriptionInfoChanged()");
List<SubscriptionInfo> sil = mSubscriptionManager.getActiveSubscriptionInfoList();
if (sil != null) {
for (SubscriptionInfo subInfo : sil) {
Log.v(TAG, "SubInfo:" + subInfo);
}
} else {
Log.v(TAG, "onSubscriptionInfoChanged: list is null");
}
}
我探索了更多,发现即使是keyguard应用程序只有在手机关闭时才能获得MCC,其他时候即使它为两个模拟人生获得相同的MNC。但承运人名称总是不同的。
这是一个bug在Android 5.1或我做错了什么?
我在三星J5的Android 5.1上也遇到了同样的问题,但在Moto X Play的Android 6.0上却可以正常工作。由于SubscriptionManager是在Android 5.1中引入的,我猜这是Android 5.1中的一个错误,在Android m中得到了纠正。
这是android 5.1中的一个bug,在我更新手机后得到了修复