你如何在Android中获得手机的MCC和MNC?
Posted
技术标签:
【中文标题】你如何在Android中获得手机的MCC和MNC?【英文标题】:how do you get the phone's MCC and MNC in Android? 【发布时间】:2009-05-20 21:31:01 【问题描述】:我发现检索 MCC 和 MNC 的唯一方法是重写活动的 onConfigurationChanged 方法,如下所示:
public void onConfigurationChanged(Configuration config)
super.onConfigurationChanged(config);
DeviceData.MCC = "" + config.mcc;
DeviceData.MNC = "" +config.mnc;
但是,我在应用程序启动时需要这些数据,并且不能等待用户切换手机的方向或等效来触发此方法。有没有更好的方法来访问当前的 Configuration 对象?
【问题讨论】:
【参考方案1】:TelephonyManager 有一种方法可以将 MCC+MNC 作为字符串 (getNetworkOperator()) 返回,这将满足您的需求。您可以通过以下方式访问它:
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
TelephonyManager tel = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
String networkOperator = tel.getNetworkOperator();
if (!TextUtils.isEmpty(networkOperator))
int mcc = Integer.parseInt(networkOperator.substring(0, 3));
int mnc = Integer.parseInt(networkOperator.substring(3));
【讨论】:
如果没有插入 SIM 卡,getNetworkOperator()
将返回一个空字符串。所以if
条件应该包含!networkOperator.isEmpty()
。我在我的 Nexus 5 上测试了它
另外,如果是 MVNO 会失败
getNetworkOperator()
返回 false。 SIM 卡已插入。为什么?
如何处理双卡设备?
'networkOperator.substring(0, 3)' 这在某些情况下会导致索引越界错误【参考方案2】:
您知道有两个 MCC/MNC 用于活动电话吗? (一个是SIM卡的国家代码和运营商ID,另一个是正在使用的网络/基站。)
如果getResources().getConfiguration().mcc
在飞行模式下不为空,则它是Sim
值TelephonyManager.getSimOperator()
,而不是tower
值TelephonyManager.getNetworkOperator()
。
我不知道 OP 想要哪个,但如果 getConfiguration
确实是 Sim
值,那么答案 3 会给他提供与原始代码不同的结果。
【讨论】:
getNetworkOperator()和getSimOperator()有什么区别;【参考方案3】:getResources().getConfiguration().mcc
是一个糟糕的选择,因为它返回一个整数,因此会影响01
或044
等有效值。显然整数不是一个好的选择。
详情见Mobile_Network_Code
更新:在澳大利亚,我们在这里验证了一个错误案例。 getNetworkOperator
返回的值与 getSimOperator
不同,后者是正确的。
在 android 文档中查看详细信息:TelephonyManager
【讨论】:
【参考方案4】:您可以通过getResources().getConfiguration()
访问当前配置。
【讨论】:
【参考方案5】:好的,事实证明 getResources().getConfiguration().mcc 技巧可能更适合大多数用途,因为如果人们将手机置于飞行模式或以其他方式使用 Wi-Fi,那么它返回一个空的 MCC。
【讨论】:
【参考方案6】:我发现即使插入了SIM卡,网络运营商有时在未连接到运营商(服务不可用)时也会像65@5
一样。这发生在运行 Android 4.1.2 的三星 S2 上。
所以在转换为 Int 时要小心。
int mcc = Integer.parseInt(networkOperator.substring(0, 3));
【讨论】:
【参考方案7】:已更新。使用这个
TelephonyManager tel = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
String networkOperator = tel.getSimOperator();
System.out.println("************mnc,mcc"+networkOperator);
if (!TextUtils.isEmpty(networkOperator))
mcc = networkOperator.substring(0, 3);
mnc = networkOperator.substring(3);System.out.println("************mnc,mcc"+mnc+mcc);
mnc_mcc.setText("************mnc,mcc"+mnc+","+mcc);
【讨论】:
以上是关于你如何在Android中获得手机的MCC和MNC?的主要内容,如果未能解决你的问题,请参考以下文章
如何在双SIM卡移动编程的情况下获得两个Sim的CID和LAC?