Отправить смс в двух сим-телефона Android на SmsManager

Я хотел бы отправить смс с помощью SmsManager, но в первой симе у меня нет баланса, в этом случае сбой смс. так как отправлять смс по второй сим только из моего приложения. Другое приложение, например, WhatsApp, отправляет сообщения в обычное время с моего второго сима, если недоступен баланс в первой сим. Так что я думаю, что это возможно. пожалуйста, помогите мне

String mobileNo = phoneNumber1.getText().toString();

  try {
    SmsManager smsManager = SmsManager.getDefault();
    smsManager.sendTextMessage(mobileNo, null, "BAL", null, null);
    Toast.makeText(getApplicationContext(), "SMS Sent!",
                Toast.LENGTH_LONG).show();
  } catch (Exception e) {
    Toast.makeText(getApplicationContext(),
        "SMS faild, please try again later!",
        Toast.LENGTH_LONG).show();
    e.printStackTrace();
  }

2 ответа

Я заглянул в класс SubscriptionManager и нашел метод getActiveSubscriptionInfoForSimSlotIndex(simIndex) для получения subscriptionInfo для слота perticular, используя этот subscriptionInfo, мы можем получить subscriptionId perticular simSlot. Используя subscriptionID, мы можем получить SMSManager для желаемого simSlot

Это сработало для меня:

public void sendSMS(final String number,final String text){
  final PendingIntent localPendingIntent1 = 
  PendingIntent.getBroadcast(mContext, 0, new Intent(this.SENT), 0);
  final PendingIntent localPendingIntent2 = 
  PendingIntent.getBroadcast(mContext, 0, new Intent(this.DELIVERED), 0);

if (Build.VERSION.SDK_INT >= 22)
{

    SubscriptionManager subscriptionManager=((Activity)mContext).getSystemService(SubscriptionManager.class);
    SubscriptionInfo subscriptionInfo=subscriptionManager.getActiveSubscriptionInfoForSimSlotIndex(simIndex);
    SmsManager.getSmsManagerForSubscriptionId(subscriptionInfo.getSubscriptionId()).sendTextMessage(number, null, text, localPendingIntent1, localPendingIntent2);
}
SmsManager.getSmsManagerForSubscriptionId(subscriptionInfo.getSubscriptionId()).sendTextMessage(number, null, text, localPendingIntent1, localPendingIntent2);
}

Где simIndex равен 0 для sim1 и 1 для sim2

Проанализировав логи телефона Mlais MX28 (с настроенным ПЗУ), я обнаружил следующую хитрость для переключения SIM-карты для отправки SMS. К сожалению, кажется, что для всех приложений происходит глобальное переключение SIM-карты (я пока не мог найти способ "сохранить и восстановить" преобладающую настройку). Кроме того, вам, вероятно, придется столкнуться с проблемой выяснения идентификаторов (sim_id) присваивается каждой из ваших SIM-карт (возможно, путем проверки выхода журнала телефона; я также не смог найти программный способ сделать это).

int simId = <place desired SIM ID here>;
Intent simIntent = new Intent("android.intent.action.SMS_DEFAULT_SIM");
simIntent.putExtra("simid", simId);
sendBroadcast(simIntent);

Я не уверен, будет ли это работать для вас (хотя код кажется независимым от производителя); но это все еще стоит выстрел, я полагаю.

Обновить:

Как ни странно, прежний подход перестал работать после некоторых попыток. Однако после некоторого дополнительного анализа журнала я наткнулся на другой подход, который использует прямую манипуляцию настройками (которая, к сожалению, требует android.permission.WRITE_SETTINGS разрешение).

ContentValues val = new ContentValues();
val.put("value", "here goes the preferred SIM ID");
getContentResolver().update(Uri.parse("content://settings/system"), val, "name='sms_sim_setting'", null);

Я считаю, что он может быть адаптирован для других операций с несколькими SIM-картами, так как база данных настроек на моем устройстве содержит записи для настроек, таких как gprs_connection_sim_setting, voice_call_sim_setting, video_call_sim_setting, так далее.

Другие вопросы по тегам