2011-11-03 18 views
19

Quiero detectar si hay dos tarjetas SIM en mi teléfono Android dual-SIM programáticamente. Encontré una API (TelephonyManager.getSIMState()), pero es para teléfonos normales con una sola SIM. ¿Hay alguna API para detectar si se insertan o no dos SIM en mi teléfono con doble SIM?Detecta el estado de dos tarjetas SIM en un teléfono Android dual-SIM

+1

[Aquí es una solución completa para lo que busca] (http://stackoverflow.com/a/17499889/703851) –

+0

uso Try biblioteca Multisim: http://stackoverflow.com/a/41544422/1665964 –

Respuesta

29

Android no es compatible con varias SIM, al menos desde el SDK. Los fabricantes de dispositivos que han creado dispositivos multi-SIM lo hacen por su cuenta. Le invitamos a ponerse en contacto con el fabricante de su dispositivo y ver si tienen un complemento SDK o algo que le permite acceder a la segunda tarjeta SIM.

Editar:(15 de de julio de, 2015)

Desde API 22, se puede comprobar para múltiples tarjetas SIM utilizando SubscriptionManager 's método getActiveSubscriptionInfoList(). Más detalles en Android Docs.

+4

Sería mejor mencionar la versión de SDK que se menciona en la respuesta. Cuando se ve esta respuesta después de muchos años, la declaración hecha puede inducir a error. – Narayanan

+0

¡Desde Android 5.2 en adelante, Android comenzó a admitir teléfonos móviles de simulación múltiple! – Saty

+0

hay varias maneras de detectar dual sim a través de la reflexión de java, sí oficialmente no es posible, pero en la mayoría de los casos hay algunos hacks, ver: http://stackoverflow.com/questions/14517338/android-check-whether-the-phone -is-dual-sim –

1

Bueno, esto no es a prueba de tontos. Pero si usted tiene dos tarjetas SIM que se encuentran en dos operadores de redes diferentes que puede intentar algo como esto:

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

@Override 
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. 
    } 
    super.onServiceStateChanged(serviceState); 
} 

} 

Lo ideal es que vaya a recibir un estado de servicio cambia SIM evento tanto para las tarjetas SIM y luego se puede comprobar por la red el nombre del operador o algo así para verificar si tienes dos tarjetas SIM. Pero necesita tener dos tarjetas SIM ejecutándose en dos redes diferentes.

+1

¿Cómo puede discernir qué tarjeta SIM está activa? – gonzobrains

+0

@gonzobrains: Ups, gracias por informarnos. Actualizado la respuesta. – Rajkiran

3

A partir de ahora, si el teléfono es alimentado por MTK, puede utilizar la clase TelephonyManagerEx desde MediaTek SDK.

Eche un vistazo a the docs.

+0

Ostensiblemente [bcm_ds branch] (https://code.google.com/p/android/issues/detail?id=14799#c26) o MediaTek SDK para ser estándar en [Android One] (https: //en.wikipedia .org/wiki/Android_One). Ambos [agregue el] (https://android.googlesource.com/platform/packages/providers/TelephonyProvider/+/b09babbf321c225b14abb013a6e1ed7041c45d06/src/com/android/providers/telephony/SmsProvider.java#275) 'SmsManager.getDefault (slotId) 'API. Lanzado simultaneamente el estándar dual sim en Android One y MediaTek SDK y son socios. Mejora [cerrado "obsoleto"] (https://code.google.com/p/android/issues/detail?id=14799#c27). –

+0

Sí esto es muy útil –

0
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()); 
    } 
Cuestiones relacionadas