Обнаружение целевой SimCard входящего звонка в устройствах Multi-Sim

10

Я прочитал много постов и перепробовал множество решений, но общая черта всех постов заключалась в том, что все они устарели, и, по крайней мере, я не смог найти решение, которое бы работало на более новых версиях Android.

Пост 1 , Результат: intent.getExtras().getInt("simId", -1)всегда возвращает -1

Пост 2 , Результат: intent.getExtras().getInt("slot", -1)всегда возвращает -1

Пост 3 , Результат:

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

Журналы:

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

он отображает одинаковые логи с одинаковым значением 0 для первой SimCard и второй SimCard.

Я также пробовал другие подобные посты. Никто не работал на новых версиях Android!

Есть ли другое решение, которое работает на более новых версиях Android (7.0 или выше)?

Алиреза Нурали
источник
intent.getExtras().getInt("item")<- Разве вы не должны использовать, itemа не "item"?
Майкл
Кроме того , вы пробовали печатать все дополнительные услуги , что Намерение делает содержит, чтобы увидеть , если есть разница в обозначении по сравнению с тем, что Вы предполагаете?
Майкл
он всегда возвращает 0 независимо от того, используется ли «item» или item.
Алиреза Нурали
Ну, "item"почти наверняка неверно в этом контексте. Как я уже сказал, попробуйте напечатать то, что у вас есть, а не то, что вы ожидаете. Хотя все это решение выглядит как хакерский, любой найденный вами полезный ключ все еще может не работать на некоторых устройствах.
Майкл

Ответы:

1

Официально единственной документированной ценностью, предоставленной намерением, является номер телефона.

Некоторые конструкторы добавляют другие значения, например номер слота sim, в намерение, но это не обязательно. Вот почему существует так много имен ключей слотов, как те, что представлены в посте 3 , каждый конструктор добавляет свою собственную реализацию.

Также возможно, что какой-то конструктор не добавил это значение в некоторых моделях, и это, безусловно, относится к вашей модели. Нет способа найти это значение, если конструктор его не доставляет.

ДГП
источник
Поскольку ответ - это просто объяснение, я не могу окончательно одобрить или отклонить его. Но, как оказалось, ответ логичен.
Алиреза Нурали
2

Если вы сделали так, это должно работать. убедитесь, что ваше тестовое устройство работает на Android 5.1 или выше. Поддержка двух симов добавлена ​​в v 5.1 (проверьте здесь )

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

Убедитесь, что вы добавили приведенное ниже разрешение в манифест

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

НОТА :

Эти ценности не должны прийти все время. Требуется поддержка провайдера сети. Пожалуйста, прочитайте документацию здесь

Идентификатор оператора текущей подписки. Вернуть UNKNOWN_CARRIER_ID, если подписка недоступна или не может быть определен оператор связи.

droidev
источник
1
Я уже добавил READ_PHONE_STATEразрешение, но всегда получаюcallingSIM = -1
Алиреза Нурали
@AlirezaNoorali, какое устройство вы используете для тестирования. и вы получаете это работает ниже Android 7 устройств?
дроидев
Устройство Samsung Galaxy S6 Android 7.0. Я не уверен насчет устройств под Android 7 ниже
Alireza Noorali
вы можете получить simIds нормально? когда тебя нет по вызову
дроидев