Мой оператор (я живу в Венесуэле) постоянно отправляет мне SMS, некоторые из них - это дерьмо, некоторые из которых мне волнуют, я действительно не хочу загружать SMS-приложение с рынка так как им делать что-то очень конкретное и простое.Android. Перехват SMS, который соответствует условию, использующему услугу
Основная идея: у меня есть BroadcastReceiver
, который фиксирует намерение, полученное с помощью SMS, чтобы быть приятным для ОС, я не занимаюсь обработкой здесь (я хочу, чтобы иметь возможность создавать сложные правила, как я могу думать и не имеют длительных проблем, возможно, используя БД или другие асинхронные задачи, которые не могут выполняться в BroadcastReceiver
), вместо этого я отправляю тот же пакет в IntentService
, который обрабатывает SMS.
Это нормально работает, я могу остановить трансляцию, если я хочу избежать уведомления системы, я получил SMS, а IntentService
обрабатывает SMS.
Выпуск:
Как обрабатывать SMS на службе, а затем решить Wether или нет, я хотел систему, чтобы заметить, что я получил SMS?
Я очень хотел бы избежать обработки в BroadcastReceiver
. (This has important repercussions to what you can do in an onReceive(Context, Intent) implementation: anything that requires asynchronous operation is not available, because you will need to return from the function to handle the asynchronous operation, but at that point the BroadcastReceiver is no longer active and thus the system is free to kill its process before the asynchronous operation completes.)
У меня была обработка SMS, и если бы это не соответствовало моим критериям, я мог бы повторно отправить трансляцию SMS Recive с дополнительным дополнением в комплекте, чтобы проверить, не было ли оно ранее проверено. Но я не могу заставить это работать.
Код:
public class SmsReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
if(!intent.getExtras().getBoolean("previouslyChecked",false)){
this.abortBroadcast();
Intent serviceIntent = new Intent(context, SmsRecievedServices.class);
serviceIntent.putExtras(intent);
context.startService(serviceIntent);
}
}
}
public class SmsRecievedServices extends IntentService {
public SmsRecievedServices() {
super("SmsRecievedServices");
}
@Override
protected void onHandleIntent(Intent intent) {
Bundle bundle = intent.getExtras();
if(!smsMatchesCriteria(bundle)){
Intent intent2 = new Intent("android.provider.Telephony.SMS_RECEIVED");
bundle.putBoolean("previouslyChecked",true);
intent2.putExtras(bundle);
sendOrderedBroadcast(intent2,"android.permission.RECEIVE_SMS");
}
}
}
Радиопередача приемник получает намерение и не делает отменить передачу, но система оленьей кожи поднимает на SMS. Есть идеи?
Edit (В ответ на комментарий BLUNDELL в):
Я думал о том, что, может быть, меня добавив дополнительный бы разрушить его, так что я попытался следующие:
public class SmsReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
int randomNum = (int)Math.ceil(Math.random()*100);
if(randomNum > 20){
this.abortBroadcast();
Intent serviceIntent = new Intent(context, SmsRecievedServices.class);
serviceIntent.putExtras(intent);
context.startService(serviceIntent);
}
}
}
public class SmsRecievedServices extends IntentService {
public SmsRecievedServices() {
super("SmsRecievedServices");
}
@Override
protected void onHandleIntent(Intent intent) {
Log.i("SMSManager","Forwarding intent");
Bundle bundle = intent.getExtras();
Intent intent2 = new Intent("android.provider.Telephony.SMS_RECEIVED");
intent2.putExtras(bundle);
sendOrderedBroadcast(intent2, "android.permission.RECEIVE_SMS");
}
}
выход LogCat является:
02-10 22:06:24.632: I/SMSManager(424): RandomNumber: 74
02-10 22:06:24.673: I/SMSManager(424): Forwarding intent
02-10 22:06:24.683: I/SMSManager(424): RandomNumber: 64
02-10 22:06:24.803: I/SMSManager(424): Forwarding intent
02-10 22:06:24.824: I/SMSManager(424): RandomNumber: 28
02-10 22:06:24.832: I/SMSManager(424): Forwarding intent
02-10 22:06:24.854: I/SMSManager(424): RandomNumber: 14
Как вы можете видеть, сообщение было скрыто от системы три раза, в четвертый раз, когда я не вызывал прерывание вещания, поскольку randomNumber меньше 20. ОС не показывать новое SMS-сообщение, ни в почтовом ящике, ни в панели уведомлений.
Вы пробовали 'sendOrderedBroadcast()' без дополнительного комплекта, чтобы узнать, выбирает ли система это. Также я предположил, что вы уже разложили намерение, которое вы не создали для SMS, чтобы узнать, есть ли у него какие-либо дополнительные функции, которые вам нужно добавить? – Blundell
Отредактировал мой вопрос, чтобы ответить на ваш комментарий. Im resending точно такое же намерение я получил в первый раз, поэтому я бы подумал, когда случайное состояние было выполнено, оно будет отображаться как новое SMS. – blindstuff
Итак, проблема на данный момент заключается в том, что ваше намерение переадресации не работает, то есть нет новых SMS-сообщений в уведомлениях? – Blundell