SmsManager продолжает попытки отправить SMS в HTC Desire - PullRequest
3 голосов
/ 23 сентября 2011

В моем приложении мне нужно отправить SMS, поэтому я использую следующий код

final String SMS_REQUEST_OK = "SMS_REQUEST_OK";
String m_sms_message = String.format("sample text");
String m_dest_number = "some number";

Intent SMSInfo = new Intent(SMS_REQUEST_OK);
SMSInfo.putExtra("msg", m_sms_message);
SMSInfo.putExtra("num", m_dest_number );
PendingIntent sentPI = PendingIntent.getBroadcast(m_context, 0,
                   SMSInfo, PendingIntent.FLAG_CANCEL_CURRENT);

m_context.registerReceiver(new BroadcastReceiver(){
    @Override
    public void onReceive(Context arg0, Intent arg1) {
        switch (getResultCode()){
            case Activity.RESULT_OK:
                Toast.makeText(m_context, String.format(
                    m_context.getResources().getString(R.string.sms_success), 
                    arg1.getExtras().getString("msg"),
                    arg1.getExtras().getString("num")), 
                    Toast.LENGTH_LONG).show();
                break;
            default:
                Toast.makeText(m_context, String.format(
                    m_context.getResources().getString(R.string.sms_error), 
                    arg1.getExtras().getString("msg"),
                    arg1.getExtras().getString("num")), 
                    Toast.LENGTH_LONG).show();
                break;
    }
}
}, new IntentFilter(SMS_REQUEST_OK));

SmsManager.getDefault().sendTextMessage(
    m_dest_number, 
    null, 
    m_sms_message, 
    sentPI, 
    null);

Я ожидаю, что он попытается отправить SMS один раз, а затем покажет сообщение Toast с результатом этой операции.Он работает нормально, если SMS отправлено успешно, однако, если это не так, он продолжает повторять попытку отправки, судя по множеству сообщений Toast (это происходит в HTC Desire (S), тестирование его на Samsung не приводит к такому поведению - Тост с ошибкой)показывается один раз).Итак, как SmsManager должен себя вести и как этого избежать (чтобы попытаться отправить СМС только один раз)?

edit Я забыл упомянуть - это происходит, если getResultCode() возвращает 133404, не проверял его на других ошибках

edit2 Согласно this , 133404 является ошибкой, характерной для htc, что означает временный сбой, и устройство выполнит повторную попытку автоматически, пока, в конце концов, не будет получен правильный код результата и не будет передана широковещательная рассылка.Тем не менее, в течение приемлемого времени не будет получено никакого документированного SmsManager вещания.Таким образом, остается вопрос - есть ли способ остановить попытки повторной попытки?

1 Ответ

2 голосов
/ 07 октября 2011

Просто подведу итог тому, что я обнаружил: согласно документации Android, ожидаемое поведение sendTextMessage () - это всего лишь одна попытка отправить сообщение, а затем результаты широковещательной передачи.Однако некоторые устройства HTC продолжают повторять попытку отправки сообщения, передавая код «временной ошибки» после каждой попытки.Поэтому, если приложение только проверяет, является ли код результата «успешным» или нет (как, похоже, делают многие приложения sms на Android Market), оно помечает сообщение как неотправленное и прекращает его прослушивание (что соответствует ожидаемому поведению функции sendTextMessage ().), что может привести к пометке сообщения как неотправленного, когда оно было успешно отправлено в более поздней попытке.

Что еще хуже, документированный код может никогда не быть отправлен, поэтому, если вы получите один из «временных кодов» HTC (133404 или 133179, но их может быть и больше). Состояние сообщения не определено - оно может быть отправлено через некоторое время или никогда не будет отправлено.Так что, как мне кажется, вы можете определить статус сообщения, только продолжая прослушивание трансляции, пока не получите правильный код результата (который никогда не может быть отправлен), или судя по трансляции доставки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...