Ресивер на отправку и доставку СМС-сообщения
Добавлено: 15 май 2014, 15:25
Приложение отправляет СМС (не на короткий номер )) ). Мне нужно получить на ресивер уведомление о том, что сообщение отправлено и доставлено. Собственно, с реализацией почти разобрался (по взятому со стороны коду). Но он не работает. Вообщем, что говорить, смотрите сами:
[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? что в нем?
[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? что в нем?