Использовать TelephonyManager.
http://developer.android.com/reference/android/telephony/TelephonyManager.html
Как отмечает Фальмарри, вы захотите захотеть использовать getPhoneType FIRST, чтобы узнать, имеете ли вы дело с телефоном GSM. Если да, то вы также можете получить состояние SIM-карты.
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:
Начиная с API 26 ( Android O Preview ), вы можете запросить SimState для отдельных слотов sim, используя getSimState(int slotIndex)
, то есть:
int simStateMain = telMgr.getSimState(0);
int simStateSecond = telMgr.getSimState(1);
официальная документация
Если вы разрабатываете с и старше API, вы можете использовать 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
, который был добавлен в API 23 - документы здесь