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)?

Alireza Noorali
fonte
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.

dgp
fonte
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.

droidev
fonte
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