Detectando o SimCard alvo da chamada recebida em dispositivos Multi-Sim


10

Eu li muitas postagens e tentei muitas soluções, mas o ponto comum de todas as postagens era que elas estavam desatualizadas e, pelo menos, não consegui encontrar uma solução que funcionasse nas versões mais recentes do Android.

Post 1 , Resultado: intent.getExtras().getInt("simId", -1)sempre retorna -1

Post 2 , Resultado: intent.getExtras().getInt("slot", -1)sempre retorna -1

Post 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));
}

Histórico:

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

exibe os mesmos logs com o mesmo valor 0 para o primeiro SimCard e o segundo SimCard.

Eu também tentei outros posts semelhantes. Nenhum funcionou em novas versões do android!

Existe outra solução que funcione em versões mais recentes do Android (7.0 ou superior)?


intent.getExtras().getInt("item")<- você não deveria estar usando itemem vez de "item"?
Michael

Além disso, você já tentou imprimir todos os extras que a intenção não contêm, para ver se há uma diferença em nomear em comparação com o que você está assumindo?
Michael

ele sempre retorna 0, seja com "item" ou item.
Alireza Noorali 14/01

Bem, "item"é quase certamente incorreto neste contexto. Como eu disse, tente imprimir o que você tem e não o que você está esperando. Embora toda essa solução pareça um hack, qualquer chave utilizável que você encontrar ainda pode não funcionar em alguns dispositivos.
Michael

Respostas:


1

Oficialmente, o único valor documentado fornecido pela intenção é o número de telefone.

Alguns construtores adicionam outros valores como o número do slot sim na intenção, mas isso não é obrigatório. É por isso que existem tantos nomes de chaves de slot possíveis, como os apresentados no post 3 , cada construtor adicionando sua própria implementação.

Também é possível que algum construtor não tenha agregado esse valor em alguns modelos, e esse certamente é o caso do seu modelo. Não há como encontrar esse valor se o construtor não o entregar.


Como a resposta é simplesmente uma explicação, não posso aprovar ou rejeitar definitivamente. Mas, como se vê, a resposta é lógica.
Alireza Noorali 21/01

2

Se você fez assim, deve funcionar. verifique se o dispositivo de teste é executado no Android 5.1 ou superior. o suporte para dual sim foi adicionado na v 5.1 (confira aqui )

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
        }
    }
}

Certifique-se de ter adicionado a permissão abaixo no manifesto

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

NOTA :

Esses valores não precisam vir o tempo todo. é necessário o suporte do provedor de rede. Leia a documentação aqui

ID da operadora da assinatura atual. Retorne UNKNOWN_CARRIER_ID se a assinatura não estiver disponível ou a operadora não puder ser identificada.


11
Eu já adicionei READ_PHONE_STATEpermissão, mas sempre recebocallingSIM = -1
Alireza Noorali 14/01

@AlirezaNoorali qual dispositivo você está usando para testar. e você está conseguindo funcionar abaixo dos dispositivos Android 7?
droidev 14/01

o dispositivo é o Samsung Galaxy S6 Android 7.0. Não tenho certeza sobre abaixo dispositivos Android 7
Alireza Noorali 14/01

você é capaz de recuperar simIds normalmente? quando você não está de plantão
droidev 14/01
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.