我想以编程的方式检测我的双卡安卓手机中是否有两张SIM卡。我找到了一个API (TelephonyManager.getSIMState()
),但它仅适用于普通单卡手机。是否有任何API可用来检测我双卡手机中是否插入了两张SIM卡?
我想以编程的方式检测我的双卡安卓手机中是否有两张SIM卡。我找到了一个API (TelephonyManager.getSIMState()
),但它仅适用于普通单卡手机。是否有任何API可用来检测我双卡手机中是否插入了两张SIM卡?
从SDK来看,Android不支持多个SIM卡。制造多卡设备的设备制造商是独自完成的。您可以联系设备制造商,了解是否有SDK附加组件或其他方法可让您访问第二个SIM卡。
编辑:(2015年7月15日)
自API 22以来,可以使用SubscriptionManager
的getActiveSubscriptionInfoList()
方法检查多个SIM卡。有关更多详细信息,请参见Android文档。
getActiveSubscriptionInfoList()
的问题在于它只返回活动的 SIM 卡,即如果双卡设备上只有一张 SIM 卡,则 getActiveSubscriptionInfoList()
将返回一个仅包含一个元素的列表。从 API 23 开始,TelepfonyManager.getPhoneCount()
返回 SIM 卡插槽的数量。 - Favolas从现在开始,如果手机是MTK的,则可以使用来自MediaTek SDK的TelephonyManagerEx类。
请参阅文档。
SmsManager.getDefault(slotId)
API。双卡标准在Android One和联发科SDK中同时推出,并且是合作伙伴。增强版已被关闭并被认为是过时的。 - Shelby Moore IIIfinal 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());
}
好的,这并不是绝对可靠的。但如果你有两张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);
}
}