2012-02-07 3 views
3

Мой оператор (я живу в Венесуэле) постоянно отправляет мне 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-сообщение, ни в почтовом ящике, ни в панели уведомлений.

+0

Вы пробовали 'sendOrderedBroadcast()' без дополнительного комплекта, чтобы узнать, выбирает ли система это. Также я предположил, что вы уже разложили намерение, которое вы не создали для SMS, чтобы узнать, есть ли у него какие-либо дополнительные функции, которые вам нужно добавить? – Blundell

+0

Отредактировал мой вопрос, чтобы ответить на ваш комментарий. Im resending точно такое же намерение я получил в первый раз, поэтому я бы подумал, когда случайное состояние было выполнено, оно будет отображаться как новое SMS. – blindstuff

+0

Итак, проблема на данный момент заключается в том, что ваше намерение переадресации не работает, то есть нет новых SMS-сообщений в уведомлениях? – Blundell

ответ

4

Приемник для android.provider.Telephony.SMS_RECEIVED намерения в приложении обмена сообщениями защищен и обрабатывает только Intents посланные платформы (она падает подмененные Intents).

Единственный способ избежать обработки в широковещательном приемнике - добавить разрешение android.permission.WRITE_SMS к вашему приложению и самостоятельно написать SMS-сообщение в базу данных.

Поскольку поставщик SMS/MMS не является опубликованным API, он может варьироваться в зависимости от версий и поставщиков - таким образом, интеграция с ним, вероятно, будет сосать.

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

0

Я читал об этом вчера, исследуя толчок. Статья здесь указывает на API, который доступен для перехвата SMS (в разделе SMS). Это может помочь?

http://tokudu.com/2010/how-to-implement-push-notifications-for-android/

+0

Я знаю, как перехватить SMS. Ваша ссылка действительно не помогает. Btw, Если вы хотите сделать push in android, я бы рекомендовал C2DM: http://stackoverflow.com/questions/4014391/anyone-doing-c2dm-on-android/4014969#4014969 – blindstuff

+0

О, хорошо, неважно. Я думал, что API может помочь https://labs.ericsson.com/apis/mobile-push/ Я решил решить проблему с C2DM. – MartinS

Смежные вопросы