Detect the status of two SIM cards in a dual-SIM Android phone-ThrowExceptions

Exception or error:

I want to detect whether two SIM cards are there in my dual-SIM android phone programmatically. I found one API (TelephonyManager.getSIMState()), but it is for normal single-SIM phones. Are there any APIs to detect whether or not two SIMs are inserted in my dual-SIM phone?

How to solve:

Android does not support multiple SIMs, at least from the SDK. Device manufacturers who have created multi-SIM devices are doing so on their own. You are welcome to contact your device manufacturer and see if they have an SDK add-on or something that allows you to access the second SIM.

Edit: (15th July, 2015)

Since API 22, you can check for multiple SIMs using SubscriptionManager‘s method getActiveSubscriptionInfoList(). More details on Android Docs.


From now, if the phone is MTK powered one, you can use TelephonyManagerEx class from MediaTek SDK.

Take a look at the docs.


Well, this is not fool proof. But if you have two SIMs which are on two different network operators you can try something like this:

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() {

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.


Ideally you’ll get SIM service state changed event for both the SIMs and then you can check for network operator name or something like that to check if you have two SIM cards. But you need to have two SIM cards running on two different networks.


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());

Leave a Reply

Your email address will not be published. Required fields are marked *