Как узнать номер SimSlot для каждого звонка/смс?

Вы знаете номер слота для SIM-карты только в широковещательном приемнике. После одного месяца исследований я получил одно решение, которое отлично работает для меня, как показано ниже.

Сначала добавьте разрешение android.permission.READ_PHONE_STATE в файл манифеста

Implement receiver for the phone event which receive call/sms events for your application

public class CallSMSReceiver extends BroadcastReceiver {

  @Override
  public void onReceive(Context context, Intent intent) {

    Bundle extras = intent.getExtras();
    if (extras != null) {
      Log.d("SIM_SLOT"," Slot Number "+capturedSimSlot(extras));
    }
  }

/*below methods captures the sim slot number from bundle */

public int capturedSimSlot(Bundle bundle){

        int whichSIM =-1;
        if (bundle.containsKey("subscription")) {
            whichSIM = bundle.getInt("subscription");
        }
        if(whichSIM >=0 && whichSIM < 5){
            /*In some device Subscription id is return as subscriber id*/
            sim = ""+whichSIM;
        }else{
            if (bundle.containsKey("simId")) {
                whichSIM = bundle.getInt("simId");
            }else if (bundle.containsKey("com.android.phone.extra.slot")) {
                whichSIM = bundle.getInt("com.android.phone.extra.slot");
            }else{
                String keyName = "";
                for(String key : bundle.keySet()){
                    if(key.contains("sim"))
                        keyName =key;
                }
                if (bundle.containsKey(keyName)) {
                    whichSIM = bundle.getInt(keyName);
                }
            }
        }
        return whichSIM;
    }
} 

person user3131373    schedule 29.12.2015    source источник
comment
Можно ли без ресивера? мы можем получить идентификатор сима из CallLog.Calls.PHONE_ACCOUNT_ID)?   -  person Naimish B. Makwana    schedule 29.12.2015
comment
да, но прежде вам нужно знать KeyName для номера слота   -  person user3131373    schedule 29.12.2015
comment
KeyName вы имеете в виду sim_id или subscribe_id ?   -  person Naimish B. Makwana    schedule 29.12.2015
comment
Да, но это не то же самое для всех устройств   -  person user3131373    schedule 29.12.2015
comment
Итак, какое другое предпочтительное решение, по вашему мнению? Мое требование: я не хочу использовать приемник или связку.   -  person Naimish B. Makwana    schedule 29.12.2015
comment
во-первых, вы читаете все имена столбцов из ContentResolver и находите simID или аналогичное имя столбца, если не находите подписку_id и сохраняете в своей базе данных или SharedPref.   -  person user3131373    schedule 29.12.2015
comment
Позже вы будете использовать это имя столбца для получения слота для сим-карты.   -  person user3131373    schedule 29.12.2015
comment
во-первых, вам нужно прочитать все имена столбцов из ContentResolver и попытаться найти ключи simId, sub_id или similer, если не найдено, проверьте подписку_id   -  person user3131373    schedule 29.12.2015
comment
список возможных ключей: simID sim_id sub_id subid subscribe_id   -  person user3131373    schedule 29.12.2015
comment
Давайте продолжим обсуждение в чате.   -  person user3131373    schedule 29.12.2015
comment
Вы также получаете номер слота для сим-карты или подписку с помощью ContentResolver, но вам нужно знать имя столбца.   -  person user3131373    schedule 07.06.2017


Ответы (1)


для смс в леденце 22+

public class MessageReceiver extends BroadcastReceiver {
 @Override
 public void onReceive(Context context, Intent intent) {  
  int slot = Integer.parseInt((String) intent.getExtras().get("slot"));
  if(slot == 0){
    // sim1
  }
  if(slot == 1){
    // sim2
  }
 }
}

проверено в примечании Lenovo K3

person Hamidreza Sadegh    schedule 22.02.2016
comment
Вы тестируете только на одном устройстве, но это не работает для всех. Ключ Samsung Devices отличается. Я тестирую на нескольких производителях. Вам нужно проверить, что ключ существует в комплекте, т. Е. Слот, simId, идентификатор подписки и т. Д. - person user3131373; 24.02.2016
comment
@user3131373 user3131373, я думаю, что из Lollipop MR1 все устройства имеют одинаковые свойства для этого - person Hamidreza Sadegh; 24.02.2016
comment
Вам нужно захватывать номер слота только для L+ или целых версий? Мой код работает для версии Android выше 3.6 [я протестировал так много устройств] - person user3131373; 25.02.2016