Detección de SimCard objetivo de llamadas entrantes en dispositivos Multi-Sim

10

Leí muchas publicaciones y probé muchas soluciones, pero el punto común de todas las publicaciones fue que todas estaban desactualizadas y al menos no pude encontrar una solución que funcionara en las versiones más recientes de Android.

Publicación 1 , Resultado: intent.getExtras().getInt("simId", -1)siempre devuelve -1

Publicación 2 , Resultado: intent.getExtras().getInt("slot", -1)siempre devuelve -1

Puesto 3 , Resultado:

String[] array = new String[]{
        "extra_asus_dial_use_dualsim",
        "com.android.phone.extra.slot",
        "slot",
        "simslot",
        "sim_slot",
        "subscription",
        "Subscription",
        "phone",
        "com.android.phone.DialingMode",
        "simSlot",
        "slot_id",
        "simId",
        "simnum",
        "phone_type",
        "slotId",
        "slotIdx"
};

for (String item :
        array) {
    Log.i(TAG, "Sim Card - " + item + " -----> " + intent.getExtras().getInt(item));
}

Registros:

PhoneCallReceiver: Sim Card - extra_asus_dial_use_dualsim -----> 0
PhoneCallReceiver: Sim Card - com.android.phone.extra.slot -----> 0
PhoneCallReceiver: Sim Card - slot -----> 0
PhoneCallReceiver: Sim Card - simslot -----> 0
PhoneCallReceiver: Sim Card - sim_slot -----> 0
PhoneCallReceiver: Sim Card - subscription -----> 0
PhoneCallReceiver: Sim Card - Subscription -----> 0
PhoneCallReceiver: Sim Card - phone -----> 0
PhoneCallReceiver: Sim Card - com.android.phone.DialingMode -----> 0
PhoneCallReceiver: Sim Card - simSlot -----> 0
PhoneCallReceiver: Sim Card - slot_id -----> 0
PhoneCallReceiver: Sim Card - simId -----> 0
PhoneCallReceiver: Sim Card - simnum -----> 0
PhoneCallReceiver: Sim Card - phone_type -----> 0
PhoneCallReceiver: Sim Card - slotId -----> 0
PhoneCallReceiver: Sim Card - slotIdx -----> 0

muestra los mismos registros con el mismo valor 0 para la primera SimCard y la segunda SimCard.

También probé otras publicaciones similares. ¡Ninguno funcionó en nuevas versiones de Android!

¿Hay alguna otra solución que funcione en las versiones más recientes de Android (7.0 o superior)?

Alireza Noorali
fuente
intent.getExtras().getInt("item")<- ¿No deberías estar usando en itemlugar de "item"?
Michael
Además, has de imprimir todos los extras que la Intención qué contienen, para ver si hay una diferencia en el nombramiento en comparación con lo que estás suponiendo?
Michael
siempre devuelve 0 ya sea con "elemento" o elemento.
Alireza Noorali
Bueno, "item"es casi seguro que es incorrecto en este contexto. Como dije, intente imprimir lo que tiene en lugar de lo que espera. Aunque toda esta solución parece un truco, cualquier clave utilizable que encuentre podría no funcionar en algunos dispositivos.
Michael

Respuestas:

1

Oficialmente, el único valor documentado proporcionado por la intención es el número de teléfono.

Algunos constructores agregan otros valores como el número de ranura sim en la intención, pero esto no es obligatorio. Es por eso que hay tantos nombres posibles de claves de ranura, como los presentados en la publicación 3 , cada constructor agrega su propia implementación.

También es posible que algún constructor no agregue este valor en algunos modelos, y ese es ciertamente el caso en su modelo. No hay forma de encontrar este valor si el constructor no lo entrega.

dgp
fuente
Debido a que la respuesta es simplemente una explicación, no puedo aprobarla o rechazarla definitivamente. Pero resulta que la respuesta es lógica.
Alireza Noorali
2

Si lo has hecho así, debería funcionar. asegúrese de que su dispositivo de prueba se ejecute en Android 5.1 o superior. Se agrega soporte dual sim en v 5.1 (Marque aquí )

public class IncomingCallInterceptor extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
    String callingSIM = "";
    Bundle bundle = intent.getExtras();
    callingSIM = String.valueOf(bundle.getInt("simId", -1));

    if(callingSIM.equals("0")){
           // Incoming call from SIM1
        } else if(callingSIM.equals("1")){
           // Incoming call from SIM2
        }
    }
}

Asegúrese de haber agregado el siguiente permiso en manifiesto

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

NOTA :

Estos valores no necesitan venir todo el tiempo. se requiere soporte de proveedor de red. Lea la documentación aquí

Identificación del operador de la suscripción actual. Devuelva UNKNOWN_CARRIER_ID si la suscripción no está disponible o el transportista no puede ser identificado.

droidev
fuente
1
Ya he agregado READ_PHONE_STATEpermiso pero siempre obtengocallingSIM = -1
Alireza Noorali
@AlirezaNoorali qué dispositivo está utilizando para probar. y lo estás haciendo funcionar en dispositivos Android 7 por debajo?
droidev
el dispositivo es Samsung Galaxy S6 Android 7.0. No estoy seguro acerca de los dispositivos Android 7 a continuación
Alireza Noorali
¿eres capaz de recuperar simIds normalmente? cuando no se está de guardia
droidev