Ожидающие намерения для отправки SMS не работают должным образом при отправке большого количества сообщений

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

Но в некоторых ситуациях я получил неправильную информацию, например, сначала я отправляю сообщение на номер 0000 (но оно не будет доставлено), а после этого я отправляю сообщение на номер 0001 и оно доставляется (сообщение на 0000 все еще не доставлено), но Я получил тост: смс доставлено на 0000 (но доставлено только сообщение на 0001). Что мне делать, чтобы исправить этот конфликт в отчетах о доставке?

Вот мой код:

try {
    SmsManager smsManager = SmsManager.getDefault();

    String to = "5556";
    String body = "Test Message";

    String SENT = "SMS_SENT";
    String DELIVERED = "SMS_DELIVERED";

    PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SENT), 0);
    PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, new Intent(DELIVERED).putExtra("senderNumber", to), 0);

    registerReceiver(new BroadcastReceiver() {
        @Override
        public void onReceive(Context arg0, Intent arg1) {
            switch (getResultCode()) {
                case Activity.RESULT_OK:
                    Toast.makeText(arg0, "SMS sent", Toast.LENGTH_LONG).show();
                    break;
                default:
                    Toast.makeText(arg0, "Error", Toast.LENGTH_LONG).show();
                    break;
            }
        }
    }, new IntentFilter(SENT));

    registerReceiver(new BroadcastReceiver() {
        @Override
        public void onReceive(Context arg0, Intent arg1) {
            switch (getResultCode()) {
                case Activity.RESULT_OK:
                    String s = arg1.getStringExtra("senderNumber");
                    Toast.makeText(getBaseContext(), "SMS delivered to " + s, Toast.LENGTH_LONG).show();
                    break;
                default:
                    Toast.makeText(getBaseContext(), "SMS not delivered", Toast.LENGTH_LONG).show();
                    break;                        
            }
        }
    }, new IntentFilter(DELIVERED));        

    smsManager.sendTextMessage(to.getText().toString(), null, body.getText().toString(), sentPI, deliveredPI);
}
catch (Exception ex) {
    Toast.makeText(this, ex.getMessage(), Toast.LENGTH_LONG).show();
}

Обновление:

Я обнаружил, что если я добавлю уникальный идентификатор в действие Intent (DELIVERED + id), все будет в порядке и не будет конфликта. но я не регистрирую Receiver при создании сообщения, для этого я использую файл манифеста:

<receiver android:name=".SendBroadcastReceiver" >
    <intent-filter>
        <action android:name="com.example.myapp.SMS_SENT" />
        <action android:name="com.example.myapp.SMS_DELIVERED" />
    </intent-filter>
</receiver> 

А также класс Receiver с именем SendBroadcastReceiver для обработки доставки sms.

Если я добавлю уникальный идентификатор в действие, как я могу добавить их в файл манифеста?


person Arashdn    schedule 28.07.2014    source источник
comment
Вы хотите сохранить действие таким же, но изменить код запроса для каждого PendingIntent. Проверьте мой ответ здесь: title="как получить SMS-подтверждение для каждого контактного лица в Android"> stackoverflow.com/questions/24673595/. В этом примере BroadcastReceiver регистрируется динамически, но просто игнорируйте это.   -  person Mike M.    schedule 28.07.2014
comment
@МайкМ. работает как шарм, спасибо за помощь   -  person Arashdn    schedule 29.07.2014


Ответы (1)


Похоже, вы не добавили свои широковещательные приемники в манифест. Вы объявили свои широковещательные приемники анонимно, поэтому, прежде всего, вам нужно объявить свои широковещательные приемники с каким-либо именем для sendPI и DeliveredPI.

person user9972359    schedule 21.06.2018