СМС получать без уведомления - PullRequest
10 голосов
/ 21 марта 2011

Я хочу получать смс в своем приложении, но не хочу, чтобы на моем Android отображалось уведомление об этом событии.Алгоритм:

  1. Получение смс (это нормально)

  2. Если это смс со специальным форматом содержимого (для моего приложения) - обработайте егос моим приложением и не отображать уведомление.

  3. Если это простое сообщение - я не хочу его обрабатывать, поэтому должно отображаться уведомление.

Я пытался использовать заказанную трансляцию, но это не помогает.Где-то я читал, что трансляция SMS_RECEIVE не заказана, но я видел некоторые приложения, которые могут получать SMS без уведомления.

Кто-нибудь может мне помочь или показать мне правильный способ решения этой проблемы?

Вызов abortBroadcast() в эфире не помогает

Ответы [ 6 ]

7 голосов
/ 29 декабря 2011

установить приоритет в вашем фильтре намерений // в манифесте

<intent-filter android:priority="100">  /*your receiver get high priority*/

// в приемнике вещания

 if (keyword_match)
      {
        // Stop it being passed to the main Messaging inbox
        abortBroadcast();
      }
5 голосов
/ 24 мая 2011

Это должно быть возможно путем регистрации вашего приложения для получения SMS-сообщений и последующего использования abortBroadcast (), когда вы обнаружите, что ваше сообщение пришло. Вы говорите, что abortBroadcast () не работает - SMS определенно обрабатывается вашим получателем SMS?

Для тех, кто хочет это сделать, читайте дальше ...

Сначала объявите получатель SMS в вашем AndroidManifest.xml и убедитесь, что у приложения есть разрешение на получение SMS-сообщений.

 <receiver android:name="mypackage.SMSReceiver">
   <intent-filter>
     <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
   </intent-filter>
 </receiver>

<uses-permission android:name="android.permission.RECEIVE_SMS" />

Вот пример кода для обработки SMS-сообщений:

public class SMSReceiver extends BroadcastReceiver
{
  @Override
  public void onReceive(Context context, Intent intent)
  {
    Bundle extras = intent.getExtras();

    Object[] pdus = (Object[])extras.get("pdus");
    for (Object pdu: pdus)
    {
      SmsMessage msg = SmsMessage.createFromPdu((byte[])pdu);

      String origin = msg.getOriginatingAddress();
      String body = msg.getMessageBody();

      // Parse the SMS body
      if (isMySpecialSMS)
      {
        // Stop it being passed to the main Messaging inbox
        abortBroadcast();
      }
    }
  }
}
1 голос
/ 25 августа 2011

Ты не должен этого делать. Другие приложения могут хотеть или должны получать трансляцию SMS_RECEIVED. Прерывание будет нарушать нормальную работу сторонних приложений. Это плохой способ программирования. Вы должны прервать только созданные вами трансляции, а не системные трансляции. Я не знаю, почему ОС Android позволяет вам это делать.

0 голосов
/ 09 января 2014

Вы делаете одну ошибку, потому что вы запустили abortBroadcast ();если ваше специальное сообщение прервало трансляцию сообщения, поэтому SMS-уведомление не отображается, а смс не сохраняется в папке «Входящие», вы должны сделать собственное уведомление в «onRecive», если ваше специальное сообщение получено.Пример:

      public class SMSReceiver extends BroadcastReceiver
    {
      @Override
      public void onReceive(Context context, Intent intent)
      {
        Bundle extras = intent.getExtras();

        Object[] pdus = (Object[])extras.get("pdus");
        for (Object pdu: pdus)
        {
          SmsMessage msg = SmsMessage.createFromPdu((byte[])pdu);

          String origin = msg.getOriginatingAddress();
          String body = msg.getMessageBody();

          // Parse the SMS body
          if (isMySpecialSMS)
          { // Stop it being passed to the main Messaging inbox
            abortBroadcast();
NotificationManager notificationManager = (NotificationManager)context.getSystemService(context.NOTIFICATION_SERVICE);
        Notification notification = new Notification(R.drawable.ic_launcher, "New Message (My Messaging app)", System.currentTimeMillis());
        // Uses the default lighting scheme
        notification.defaults |= Notification.DEFAULT_LIGHTS;
        // Will show lights and make the notification disappear when the presses it
        notification.flags |= Notification.FLAG_AUTO_CANCEL | Notification.FLAG_SHOW_LIGHTS;
        Intent notificationIntent = new Intent(context, SplashActivity.class);
        PendingIntent pendingIntent =PendingIntent.getActivity(context, 0,
                new Intent(context, SplashActivity.class), 0);

        Log.i("Wakeup", "Display Wakeup");
        PowerManager pm = (PowerManager)context.getApplicationContext().getSystemService(Context.POWER_SERVICE);
        WakeLock wakeLock = pm.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "Phone WakeUp");
        wakeLock.acquire();

        notification.setLatestEventInfo(context, "My Messaging App(New Message)",msg, pendingIntent);
        //notification.sound.
        notification.defaults |= Notification.DEFAULT_SOUND;
        notificationManager.notify(9999, notification);
          }
         else{
        //Continue Broadcasting to main android app
         }
        }
      }
    }

Я надеюсь, что это решит вашу проблему

0 голосов
/ 29 октября 2011

вам нужен android: атрибут приоритета, чтобы он работал

<intent-filter android:priority="1"> 
                <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
</intent-filter> 
0 голосов
/ 21 марта 2011

не уверен, что я точно знаю, что вы пытаетесь сделать, но насколько я понимаю, вы просто хотите знать, как не отправлять уведомление?

почему ты не можешь просто сделать:

If(instance 2){
//do your processing
}else{
//send notification
}

если вы хотите заблокировать ОС от трансляции, то вам может не повезти, потому что я не верю, что вы можете сделать это

...