How can I check whether the Sim Card is available in an android device?

前端 未结 3 1600
-上瘾入骨i
-上瘾入骨i 2020-11-27 13:58

I need help checking whether a device has a sim card programatically. Please provide sample code.

相关标签:
3条回答
  • 2020-11-27 14:36

    You can check with the below code :

    public static boolean isSimSupport(Context context)
        {
            TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);  //gets the current TelephonyManager
            return !(tm.getSimState() == TelephonyManager.SIM_STATE_ABSENT);
    
        }
    
    0 讨论(0)
  • 2020-11-27 14:57

    Found another way to do this.

    public static boolean isSimStateReadyorNotReady() {
            int simSlotCount = sSlotCount;
            String simStates = SystemProperties.get("gsm.sim.state", "");
            if (simStates != null) {
                String[] slotState = simStates.split(",");
                int simSlot = 0;
                while (simSlot < simSlotCount && slotState.length > simSlot) {
                    String simSlotState = slotState[simSlot];
                    Log.d("MultiSimUtils", "isSimStateReadyorNotReady() : simSlot = " + simSlot + ", simState = " + simSlotState);
                    if (simSlotState.equalsIgnoreCase("READY") || simSlotState.equalsIgnoreCase("NOT_READY")) {
                        return true;
                    }
                    simSlot++;
                }
            }
            return false;
        }
    
    0 讨论(0)
  • 2020-11-27 15:01

    Use TelephonyManager.

    http://developer.android.com/reference/android/telephony/TelephonyManager.html

    As Falmarri notes, you will want to use getPhoneType FIRST of all, to see if you are even dealing with a GSM phone. If you are, then you can also get the SIM state.

    TelephonyManager telMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        int simState = telMgr.getSimState();
                switch (simState) {
                    case TelephonyManager.SIM_STATE_ABSENT:
                        // do something
                        break;
                    case TelephonyManager.SIM_STATE_NETWORK_LOCKED:
                        // do something
                        break;
                    case TelephonyManager.SIM_STATE_PIN_REQUIRED:
                        // do something
                        break;
                    case TelephonyManager.SIM_STATE_PUK_REQUIRED:
                        // do something
                        break;
                    case TelephonyManager.SIM_STATE_READY:
                        // do something
                        break;
                    case TelephonyManager.SIM_STATE_UNKNOWN:
                        // do something
                        break;
                }
    

    EDIT:

    Starting at API 26 (Android O Preview) you can query the SimState for individual sim slots by using getSimState(int slotIndex) ie:

    int simStateMain = telMgr.getSimState(0);
    int simStateSecond = telMgr.getSimState(1);
    

    official documentation

    If you're developing with and older api, you can use TelephonyManager's

    String getDeviceId (int slotIndex)
    //returns null if device ID is not available. ie. query slotIndex 1 in a single sim device
    
    int devIdSecond = telMgr.getDeviceId(1);
    
    //if(devIdSecond == null)
    // no second sim slot available
    

    which was added in API 23 - docs here

    0 讨论(0)
提交回复
热议问题