Android dual SIM card API

Android does not support multiple SIM features before API 22. But from Android 5.1 (API level 22) onwards, Android started supporting multiple SIMs. More details on Android Documentation

Reference from this Original Answer


You can use MultiSim library to get details from multi-sim devices.

Available info from each sim card: IMEI, IMSI, SIM Serial Number, SIM State, SIM operator code, SIM operator name, SIM country iso, network operator code, network operator name, network operator iso, network type, roaming status.

Just add the lines below in your app-level Gradle script:

dependencies {
    compile 'com.kirianov.multisim:multisim:2.0@aar'
}

Don't forget add required permission in AndroidManifest.xml:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

Use similar code in your code:

MultiSimTelephonyManager multiSimTelephonyManager = new MultiSimTelephonyManager(this);
// or
MultiSimTelephonyManager multiSimTelephonyManager = new MultiSimTelephonyManager(this, new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {
    updateInfo();
  }
});


public void updateInfo() {

  // for update UI
  runOnUiThread(new Runnable() {
    @Override
    public void run() {
      multiSimTelephonyManager.update();
      useInfo();
    }
  }

  // for update background information
  multiSimTelephonyManager.update();
  useInfo();
}

public void useInfo() {

  // get number of slots:
  if (multiSimTelephonyManager != null) {
     multiSimTelephonyManager.sizeSlots();
  }

  // get info from each slot:
  if (multiSimTelephonyManager != null) {
    for(int i = 0; i < multiSimTelephonyManager.sizeSlots(); i++) {
      multiSimTelephonyManager.getSlot(i).getImei();
      multiSimTelephonyManager.getSlot(i).getImsi();
      multiSimTelephonyManager.getSlot(i).getSimSerialNumber();
      multiSimTelephonyManager.getSlot(i).getSimState();
      multiSimTelephonyManager.getSlot(i).getSimOperator();
      multiSimTelephonyManager.getSlot(i).getSimOperatorName();
      multiSimTelephonyManager.getSlot(i).getSimCountryIso();
      multiSimTelephonyManager.getSlot(i).getNetworkOperator();
      multiSimTelephonyManager.getSlot(i).getNetworkOperatorName();
      multiSimTelephonyManager.getSlot(i).getNetworkCountryIso();
      multiSimTelephonyManager.getSlot(i).getNetworkType();
      multiSimTelephonyManager.getSlot(i).isNetworkRoaming();
    }
  }
}

// or for devices above android 6.0
MultiSimTelephonyManager multiSimTelephonyManager = new MultiSimTelephonyManager(MyActivity.this, broadcastReceiverChange);

Usage:

// get info about slot 'i' by methods:
multiSimTelephonyManager.getSlot(i).

Force update info:

// force update phone info (needed on devices above android 6.0 after confirm permissions request)
multiSimTelephonyManager.update();

Handle of permissions request (6.0+):

// in YourActivity for update info after confirm permissions request on  devices above android 6.0
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (multiSimTelephonyManager != null) {
        multiSimTelephonyManager.update();
    }
}

there are 3 different categories ...

  1. features supported and documented
  2. Features available and un-documented
  3. features unavailable

So the dual sim features are available but not documented and hence not officially supported.

Having said that it doesn't mean that it will not be usable , It just means that android(or for that matter google or even manufaturer) is not liable to support your apps functionality.

But it might just work , for eg the contacts is a similar thing.

You might then ask up how would everyone know about the features if in case its not documented.. Hey android is open source .. go look into code and find it for yourself . Thats what I guess the multi sim developers did.


You can use SubscriptionInfo class to achieve it,

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
        val mSubscriptionManager = getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE) as SubscriptionManager
        // val mSubscriptionManager = SubscriptionManager.from(baseContext)
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
            val subscriptions = mSubscriptionManager.activeSubscriptionInfoList
        //loop through number of SIMS inserted
            for (subscriptionInfo in subscriptions) {
                //the number of this subscription if the calling app has been granted the READ_PHONE_NUMBERS permission, or an empty string otherwise
                Log.v("SIM", subscriptionInfo.number)
                //the ISO country code
                Log.v("SIM", subscriptionInfo.countryIso)
                //the name displayed to the user that identifies Subscription provider name
                Log.v("SIM", subscriptionInfo.carrierName.toString())
                //the name displayed to the user that identifies this subscription
                Log.v("SIM", subscriptionInfo.displayName.toString())
                //The MCC, as a string. This value may be null.
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                    Log.v("SIM", subscriptionInfo.mccString.toString())
                } else {
                    Log.v("SIM", subscriptionInfo.mcc.toString())
                }
                //The MNC, as a string. This value may be null.
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                    Log.v("SIM", subscriptionInfo.mncString.toString())
                } else {
                    Log.v("SIM", subscriptionInfo.mnc.toString())
                }
            }
        }
    }