3

I am working on an app where I need details of user's SIM his phone number, imei number and operator . so far I have achieved his IMEI's numbers refering this answer, is his device single sim or dual SIM. How do I get his number of both the SIM and the name of operator for both the connections.

Community
  • 1
  • 1
onkar
  • 4,427
  • 10
  • 52
  • 89

4 Answers4

3

Try this, works for me:

TelephonyManager manager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
String carrierName = manager.getNetworkOperatorName();
Opal
  • 81,889
  • 28
  • 189
  • 210
Ana Llera
  • 1,376
  • 16
  • 32
  • There is not support in the Android SDK for multiple SIM cards. Only we can get the name of the Current Network Operator or SIM operator and in case you dont have sim the result will be "". This will work but only for the main operator. – Ana Llera Jul 17 '14 at 08:51
  • 3
    From API 22, now you can check for multiple SIM cards. Check out [Android Docs](https://developer.android.com/reference/android/telephony/SubscriptionManager.html#getActiveSubscriptionInfoList%28%29) – Bugs Happen Jul 14 '15 at 20:19
3

Fortunately there are several native solutions. Hope this will help somebody.

For API >=17:

TelephonyManager manager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);

// Get information about all radio modules on device board
// and check what you need by calling #getCellIdentity.

final List<CellInfo> allCellInfo = manager.getAllCellInfo();
for (CellInfo cellInfo : allCellInfo) {
    if (cellInfo instanceof CellInfoGsm) {
        CellIdentityGsm cellIdentity = ((CellInfoGsm) cellInfo).getCellIdentity();
        //TODO Use cellIdentity to check MCC/MNC code, for instance.
    } else if (cellInfo instanceof CellInfoWcdma) {
        CellIdentityWcdma cellIdentity = ((CellInfoWcdma) cellInfo).getCellIdentity();
    } else if (cellInfo instanceof CellInfoLte) {
        CellIdentityLte cellIdentity = ((CellInfoLte) cellInfo).getCellIdentity();
    } else if (cellInfo instanceof CellInfoCdma) {
        CellIdentityCdma cellIdentity = ((CellInfoCdma) cellInfo).getCellIdentity();
    } 
}

In AndroidManifest add permission:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
</manifest>

To get network operator you can check mcc and mnc codes:

For API >=22:

final SubscriptionManager subscriptionManager = SubscriptionManager.from(context);
final List<SubscriptionInfo> activeSubscriptionInfoList = subscriptionManager.getActiveSubscriptionInfoList();
for (SubscriptionInfo subscriptionInfo : activeSubscriptionInfoList) {
    final CharSequence carrierName = subscriptionInfo.getCarrierName();
    final CharSequence displayName = subscriptionInfo.getDisplayName();
    final int mcc = subscriptionInfo.getMcc();
    final int mnc = subscriptionInfo.getMnc();
    final String subscriptionInfoNumber = subscriptionInfo.getNumber();
}

For API >=23. To just check if phone is dual/triple/many sim:

TelephonyManager manager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
if (manager.getPhoneCount() == 2) {
    // Dual sim
}
oxied
  • 1,773
  • 19
  • 14
  • Seems for SubscriptionManager you need another dangerous permission READ_PHONE_STATE. Also, first solution will return not sim, but towers info. – sandrstar Sep 05 '18 at 15:09
1

try here:

private List<String> getNetworkOperator(final Context context) {
    // Get System TELEPHONY service reference
    List<String> carrierNames = new ArrayList<>();
    try {
        final String permission = Manifest.permission.READ_PHONE_STATE;
        if ( (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) && (ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED) ){
            final List<SubscriptionInfo> subscriptionInfos = SubscriptionManager.from(context).getActiveSubscriptionInfoList();
            for (int i = 0; i < subscriptionInfos.size(); i++) {
                carrierNames.add(subscriptionInfos.get(i).getCarrierName().toString());
            }

        } else {
            TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
            // Get carrier name (Network Operator Name)
            carrierNames.add(telephonyManager.getNetworkOperatorName());

        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return carrierNames;
}
DàChún
  • 4,751
  • 1
  • 36
  • 39
  • "SubscriptionManager.from(context).getActiveSubscriptionInfoList()" works well in both single and dual sims context, contrary to "telephonyManager.getNetworkOperatorName()" which more often than not returns only one carrier name in dual sims. – Makari Kevin Jan 13 '19 at 04:33
1
        // Use this code, it will provide all the info realated both sim card 

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

            if (getSimInfo(context).get(0) != null) {  // SIM 1
                               getSimInfo(context).get(0).getMcc()); 
                               getSimInfo(context).get(0).getMnc());
                            } else {
                               Log.d("Sim card", "Sim card not available");
                            }
                            if (getSimInfo(context).get(1) != null) { // SIM 2
                                getSimInfo(context).get(1).getMcc());
                                getSimInfo(context).get(1).getMnc());
                            } else {
                               Log.d("Sim card", "Sim card not available");
                            }
                            if (getNetworkOperator(context).get(0) != null) { // SIM 1
     (String)getSimInfo(context).get(0).getCarrierName());
                            } else {
                               Log.d("Sim card", "Sim card not available");
                            }
                            if (getNetworkOperator(context).get(1) != null) {// SIM 2 
 (String)getSimInfo(context).get(1).getCarrierName());
                            } else {
                              Log.d("Sim card", "Sim card not available");
                            }

        // getSimInfo
        public List<SubscriptionInfo> getSimInfo(Context context) {
                SubscriptionManager subManager = (SubscriptionManager) context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
                List<SubscriptionInfo> subscriptionInfoList = new ArrayList<>();
                subscriptionInfoList = subManager.getActiveSubscriptionInfoList();
                Log.d("LIST LIST", subscriptionInfoList.toString());
                if (subscriptionInfoList == null) {
                    Toast.makeText(context, "address not found", Toast.LENGTH_SHORT).show();
                }
                return subscriptionInfoList;
            }

            // getNetworkOperator 
            public List<String> getNetworkOperator(final Context context) {
                // Get System TELEPHONY service reference
                List<String> carrierNames = new ArrayList<>();
                try {
                    final String permission = android.Manifest.permission.READ_PHONE_STATE;
                    if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) && (ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED)) {
                        final List<SubscriptionInfo> subscriptionInfos = SubscriptionManager.from(context).getActiveSubscriptionInfoList();
                        for (int i = 0; i < subscriptionInfos.size(); i++) {
                            carrierNames.add(subscriptionInfos.get(i).getCarrierName().toString());
                        }

                    } else {
                        TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
                        // Get carrier name (Network Operator Name)
                        carrierNames.add(telephonyManager.getNetworkOperatorName());
            enter code here
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return carrierNames;
            }
Ashish Kumar
  • 1,088
  • 8
  • 17