检测双卡Android手机中两张SIM卡的状态

20

我想以编程的方式检测我的双卡安卓手机中是否有两张SIM卡。我找到了一个API (TelephonyManager.getSIMState()),但它仅适用于普通单卡手机。是否有任何API可用来检测我双卡手机中是否插入了两张SIM卡?


1
这里是你所寻找的完整解决方案:https://dev59.com/7mUq5IYBdhLWcg3waPtC#17499889 - Vaibhav Jani
尝试使用MultiSim库:https://dev59.com/6Ggu5IYBdhLWcg3wdG2o#41544422 - Tapa Save
4个回答

35

从SDK来看,Android不支持多个SIM卡。制造多卡设备的设备制造商是独自完成的。您可以联系设备制造商,了解是否有SDK附加组件或其他方法可让您访问第二个SIM卡。

编辑:(2015年7月15日)

自API 22以来,可以使用SubscriptionManagergetActiveSubscriptionInfoList()方法检查多个SIM卡。有关更多详细信息,请参见Android文档


4
最好在答案中提到所提及的SDK版本。当许多年后查看此答案时,该声明可能会误导读者。 - Narayanan
从Android 5.2开始,Android开始支持多SIM手机! - Saty
有几种方法可以通过Java反射检测双卡,虽然官方上并不支持,但在大多数情况下存在一些黑科技。请参考:https://dev59.com/7mUq5IYBdhLWcg3waPtC - Amir Hossein Ghasemi
@CommonsWare getActiveSubscriptionInfoList() 的问题在于它只返回活动的 SIM 卡,即如果双卡设备上只有一张 SIM 卡,则 getActiveSubscriptionInfoList() 将返回一个仅包含一个元素的列表。从 API 23 开始,TelepfonyManager.getPhoneCount() 返回 SIM 卡插槽的数量。 - Favolas
有没有可能知道哪个是电话呼叫的默认设置(如果有的话)? - android developer
显示剩余2条评论

3

从现在开始,如果手机是MTK的,则可以使用来自MediaTek SDK的TelephonyManagerEx类。

请参阅文档


表面上,bcm_ds分支或联发科SDK将成为Android One的标准。两者都添加了SmsManager.getDefault(slotId) API。双卡标准在Android One和联发科SDK中同时推出,并且是合作伙伴。增强版已被关闭并被认为是过时的。 - Shelby Moore III
是的,这非常有帮助。 - Lalit kumar

2
final SubscriptionManager subscriptionManager = SubscriptionManager.from(getApplicationContext());
    final List<SubscriptionInfo> activeSubscriptionInfoList = subscriptionManager.getActiveSubscriptionInfoList();
    int simCount = activeSubscriptionInfoList.size();
    btnBack.setText(simCount+" Sim available");
    Log.d("MainActivity: ","simCount:" +simCount);

    for (SubscriptionInfo subscriptionInfo : activeSubscriptionInfoList) {
        Log.d("MainActivity: ","iccId :"+ subscriptionInfo.getIccId()+" , name : "+ subscriptionInfo.getDisplayName());
    }

1

好的,这并不是绝对可靠的。但如果你有两张SIM卡,分别属于两个不同的网络运营商,你可以尝试类似以下的方法:

PhoneServiceStateListener listener = new PhoneServiceStateListener(this);
tm.listen(listener, PhoneStateListener.LISTEN_SERVICE_STATE);


.
.
.
class PhoneServiceStateListener extends PhoneStateListener {
Context context = null;

public PhoneServiceStateListener(Context context) {
    this.context = context;
}

public PhoneServiceStateListener() {
}

@Override
public void onServiceStateChanged(ServiceState serviceState) {

    if (serviceState.getState() == ServiceState.STATE_IN_SERVICE) {
        //You get this event when your SIM is in service.
        //If you get this event twice, chances are more that your phone is Dual SIM.
        //Alternatively, you can toggle Flight Mode programmatically twice so
        //that you'll get service state changed event.
    }
    super.onServiceStateChanged(serviceState);
}

}

理想情况下,您将获得SIM服务状态更改事件的两个SIM卡,并且您可以检查网络运营商名称或类似内容,以检查是否有两个SIM卡。但是,您需要在两个不同的网络上运行两个SIM卡。

1
它如何区分哪张SIM卡是活动的? - gonzobrains
@gonzobrains:糟糕,谢谢您的提醒。已更新答案。 - Rajkiran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接