Wykrywanie docelowej karty SimCard połączenia przychodzącego w urządzeniach Multi-Sim

10

Przeczytałem wiele postów i wypróbowałem wiele rozwiązań, ale wspólnym punktem wszystkich postów było to, że wszystkie były przestarzałe i przynajmniej nie mogłem znaleźć rozwiązania, które działałoby na nowszych wersjach Androida.

Post 1 , Wynik: intent.getExtras().getInt("simId", -1)zawsze zwraca -1

Po 2 , Wynik: intent.getExtras().getInt("slot", -1)zawsze zwraca -1

Post 3 , Wynik:

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

Dzienniki:

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

wyświetla te same logi o tej samej wartości 0 dla pierwszej karty SIM i drugiej karty SIM.

Próbowałem także innych podobnych postów. Żadne nie działało na nowych wersjach Androida!

Czy istnieje inne rozwiązanie, które działa na nowszych wersjach Androida (7.0 lub nowszy)?

Alireza Noorali
źródło
intent.getExtras().getInt("item")<- Nie powinieneś używać itemzamiast "item"?
Michael
Ponadto, czy próbowałeś drukowania wszystkimi dodatkami, że zamiar musi zawierać, aby zobaczyć czy jest różnica w stosunku do nazewnictwa, co masz przy założeniu?
Michael
zawsze zwraca 0, niezależnie od tego czy „item” czy item.
Alireza Noorali
Cóż, "item"jest prawie na pewno niepoprawny w tym kontekście. Tak jak powiedziałem, spróbuj wydrukować to, co masz, a nie to, czego oczekujesz. Chociaż całe to rozwiązanie wygląda trochę jak włamanie, więc każdy użyteczny klucz, który znajdziesz, może nadal nie działać na niektórych urządzeniach.
Michael

Odpowiedzi:

1

Oficjalnie jedyną udokumentowaną wartością podaną przez intencję jest numer telefonu.

Niektórzy konstruktorzy dodają w zamian inne wartości, takie jak numer gniazda karty SIM, ale nie jest to obowiązkowe. Właśnie dlatego istnieje tak wiele nazw kluczy gniazd, jak te przedstawione w poście 3 , a każdy konstruktor dodaje własną implementację.

Możliwe jest również, że jakiś konstruktor nie dodał tej wartości w niektórych modelach, a na pewno tak jest w przypadku twojego modelu. Nie ma możliwości znalezienia tej wartości, jeśli konstruktor jej nie dostarczy.

dgp
źródło
Ponieważ odpowiedź jest po prostu wyjaśnieniem, nie mogę jej ostatecznie zaakceptować ani odrzucić. Ale jak się okazuje, odpowiedź jest logiczna.
Alireza Noorali
2

Jeśli zrobiłeś tak, to powinno działać. upewnij się, że Twoje urządzenie testujące działa na systemie Android 5.1 lub nowszym. obsługa podwójnej karty SIM została dodana w wersji 5.1 (sprawdź tutaj )

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

Upewnij się, że dodałeś poniższe zezwolenie w manifeście

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

UWAGA :

Wartości te nie muszą pojawiać się cały czas. wymagana jest obsługa dostawcy sieci. Przeczytaj dokumentację tutaj

Identyfikator operatora aktualnej subskrypcji. Zwróć wartość UNKNOWN_CARRIER_ID, jeśli subskrypcja jest niedostępna lub nie można zidentyfikować przewoźnika.

droidev
źródło
1
Dodałem już READ_PHONE_STATEpozwolenie, ale zawsze dostajęcallingSIM = -1
Alireza Noorali
@AlirezaNoorali, którego urządzenia używasz do testowania. i zaczynasz działać na urządzeniach z Androidem 7 poniżej?
droidev
urządzeniem jest Samsung Galaxy S6 Android 7.0. Nie jestem pewien co do urządzeń z
Androidem
czy jesteś w stanie normalnie odzyskać karty SIM? kiedy nie jesteś na dyżurze
droidev