Страница 1 из 1

Ресивер на отправку и доставку СМС-сообщения

Добавлено: 15 май 2014, 15:25
Igor-vrn
Приложение отправляет СМС (не на короткий номер )) ). Мне нужно получить на ресивер уведомление о том, что сообщение отправлено и доставлено. Собственно, с реализацией почти разобрался (по взятому со стороны коду). Но он не работает. Вообщем, что говорить, смотрите сами:

[syntax=java5]
private BroadcastReceiver sent = null; // широковещательный приемник на отправку
private BroadcastReceiver delivered = null; // отчет о доставке


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

IntentFilter in_sent = new IntentFilter("SMS_SENT");
sent = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
switch(getResultCode()) {
case Activity.RESULT_OK:
Toast.makeText(context, "Сообщение отправлено", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
Toast.makeText(context, "Сбой при отправке", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
Toast.makeText(context, "Ошибка. Нет сети", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
Toast.makeText(context, "Ошибка. Радиомодуль выключен", Toast.LENGTH_SHORT).show();
break;
}
Toast.makeText(context, "Отправка", Toast.LENGTH_SHORT).show();
isSending = false;
//ChangeStatus();
}

};
this.registerReceiver(sent, in_sent);

IntentFilter in_delivered = new IntentFilter("SMS_DELIVERED");
delivered = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
switch(getResultCode()) {
case Activity.RESULT_OK:
Toast.makeText(context, "Доставлено", Toast.LENGTH_SHORT).show();
break;
case Activity.RESULT_CANCELED:
Toast.makeText(context, "Не доставлено", Toast.LENGTH_SHORT).show();
break;
}
}
};
this.registerReceiver(delivered, in_delivered);


}[/syntax]

СМС отправляется. Проверял на устройстве. А уведомление на Broadcast не приходит, вообще. Код отправки СМС не привожу. Там две строчки.

Думаю, проблема с Intent фильтром. См. там где он объявлен. А именно с его типом. Собственно я новичок в сфере всех этих интентов, броадкастов и т.д. Только учусь. Если правильно понимаю, то сделано примерно как с обработкой событий. Вызывая registerReceiver() , передаем ему параметры: Broadcast, который будет является анонимным классом в нашей активити и который собственно обрабатывает уведомление об успешной отправке СМС, а второй параметр - IntentFilter - это тип уведомления (намерения), о свершении которых надо сообщить в активити в переданный ей Broadcast и который имеет метод onReceive для обработки нашего Intent вызова.

Чтобы не добавлять лишнюю тему, поясните что за параметры у onReceive(... )? Какой Context она передает? ссылку на нашу Activity? и как понять переданный Intent? что в нем?

Re: Ресивер на отправку и доставку СМС-сообщения

Добавлено: 05 июн 2014, 09:29
Saint_Byte
Насколько я помню надо в качестве параметра у функции которая отправляет смс надо указать pengingIntent в который все вам придет и статус отправки и доставки.

Re: Ресивер на отправку и доставку СМС-сообщения

Добавлено: 05 июн 2014, 10:05
KamiSempai
Вам нужно сделать PendingIntent и передать его в метод SmsManager.getDefault().sendTextMessage(...). Там их 2. Один на отсылку, другой на доставку. Если слать длинные СМС через sendMultipartTextMessage то нужно будет делать целый массив PendingIntent-ов.

Если хотите использовать BroadcastReceiver то PendingIntent получается через PendingIntent.getBroadcast(Context context, int requestCode, Intent intent, int flags), где intent - это intent для вызова BroadcastReceiver.

Однако, если все происходит в рамках одной активити, лучше сделать как в этом уроке: http://startandroid.ru/ru/uroki/vse-uro ... ntent.html В вашем случае, сервис тут не при чем, но PendingIntent делается по тому же принципу. Плюс такого метода очевиден - не нужно городить кучу BroadcastReceiver-ов.

PS: Существенное замечание по поводу урока, ссылку на который я дал. Там одиним из параметров createPendingResult указан null. Не делайте так, там должен быть Intent, иначе приложение не будет работать на 4 Андроиде. К тому же этот Intent, возможно, понадобится для идентификации конкретного сообщения. Можно положить в него свои Extras и достать их в onActivityResult из Intent data.