Как отправлять SMS по одному в Android

Мое приложение для отправки SMS имеет довольно стандартный цикл для перебора списка телефонных номеров и использования SMSManager.sendMultipartTextMessage().

BroadcastReceiver (по одному на часть сообщения с уникальным PendingIntent, получатель фильтрует это намерение) используется для записи любых сбоев.

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

Я считаю, что их телефоны не в состоянии обрабатывать многочисленные SMS-сообщения, приходящие на высокой скорости. Даже если я добавлю задержку (не очень хорошее решение) в свою петлю, я думаю, что SMS все равно каким-то образом накапливаются в телефоне, а затем внезапно переполняются, вызывая общие сбои.

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

Я думал о бесконечном цикле, который ждал, пока каждый BroadcastReceiver.onReceive() не сообщит об этом (эффективный прослушиватель), но я ненавижу идею бесконечного цикла (и пытаюсь управлять им для всех потоков ошибок).

Любые идеи о том, как я могу гарантировать, что SMS обрабатывается по одному (дросселирование)?


person LakesDeveloper    schedule 12.05.2013    source источник


Ответы (1)


Используйте ожидающее намерение, чтобы дождаться статуса сообщения (общая ошибка/радио выключено/нулевой PDU/SMS доставлено/SMS не доставлено).

SmsManager smsManager=SmsManager.getDefault();
String SENT = "SMS_SENT";
String DELIVERED = "SMS_DELIVERED";     
public void sendSms(String phoneNumber,String sms){

 PendingIntent sentPI = PendingIntent.getBroadcast(this, 0,
            new Intent(SENT), 0);

        PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0,
            new Intent(DELIVERED), 0);

 //---when the SMS has been sent---
    registerReceiver(new BroadcastReceiver(){
        @Override
        public void onReceive(Context arg0, Intent arg1) {
            switch (getResultCode())
            {
                case Activity.RESULT_OK:
                    // do what you need to do if OK
                    break;
                case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                    // do what you need to do if GENERIC FAILURE
                    break;
                case SmsManager.RESULT_ERROR_NO_SERVICE:
                    // do what you need to do if no Service
                    break;
                case SmsManager.RESULT_ERROR_NULL_PDU:

                    break;
                case SmsManager.RESULT_ERROR_RADIO_OFF:

                    break;
            }
        }
    }, new IntentFilter(SENT));

    //---when the SMS has been delivered---
    registerReceiver(new BroadcastReceiver(){
        @Override
        public void onReceive(Context arg0, Intent arg1) {
            switch (getResultCode())
            {
                case Activity.RESULT_OK:
                    // Send next sms when previous one delivered your choice

                    break;
                case Activity.RESULT_CANCELED:
                    //Do something if not delivered
                    break;                        
            }
        }
    }, new IntentFilter(DELIVERED));


    smsManager.sendTextMessage(phoneNumber, null, sms, sentPI, deliveredPI);

}
person Neo    schedule 12.05.2013
comment
Спасибо за ответ, но как это делает его дросселем? Я действительно не хочу вызывать sendSMS() из onReceive(). И если я это сделаю, это не распространяется на случай, когда SMSManager.sendMultipartTextMessage() создает исключение. - person LakesDeveloper; 12.05.2013
comment
Просто создайте логическое значение, установите для него значение true, когда смс будет успешно отправлено, и сделайте цикл while для этого логического значения. - person Neo; 12.05.2013
comment
Я пытался избежать бесконечного цикла, но я попробую. Конечно, ваше решение звучит так, как будто оно должно работать. - person LakesDeveloper; 13.05.2013
comment
На этой неделе я провожу бета-тестирование — в случае успеха ваш ответ будет отмечен. - person LakesDeveloper; 14.05.2013