Android – приемник SMS-вещания

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

Я пытаюсь получить уведомление о появлении нового SMS-сообщения.

Вот моя программа:

package Technicaljar.SMSBroadcastReceiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.telephony.SmsMessage; import android.util.Log; public class SMSBroadcastReceiver extends BroadcastReceiver { private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED"; private static final String TAG = "SMSBroadcastReceiver"; @Override public void onReceive(Context context, Intent intent) { Log.i(TAG, "Intent recieved: " + intent.getAction()); if (intent.getAction() == SMS_RECEIVED) { Bundle bundle = intent.getExtras(); if (bundle != null) { Object[] pdus = (Object[])bundle.get("pdus"); final SmsMessage[] messages = new SmsMessage[pdus.length]; for (int i = 0; i  -1) { Log.i(TAG, "Message recieved: " + messages[0].getMessageBody()); } } } } } 

И файл манифеста:

              ?              

Я отправляю SMS через Telnet, и я не вижу никаких сообщений о намерениях в logcat. Вот мой logcat с момента установки.

 D/AndroidRuntime( 478): D/AndroidRuntime( 478): >>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<< D/AndroidRuntime( 478): CheckJNI is ON D/AndroidRuntime( 478): --- registering native functions --- D/AndroidRuntime( 478): Shutting down VM D/dalvikvm( 478): Debugger has detached; object registry had 1 entries I/AndroidRuntime( 478): NOTE: attach of thread 'Binder Thread #3' failed D/Mms:app ( 220): getSmsNewMessageNotificationInfo: count=14, first addr=12345, thread_id=4 D/dalvikvm( 151): GC_EXPLICIT freed 391 objects / 22552 bytes in 65ms D/dalvikvm( 220): GC_EXPLICIT freed 926 objects / 44840 bytes in 73ms 

Таким образом, SMS, похоже, получил эмулятор, но похоже, что никакие намерения не срабатывают. Что я здесь делаю неправильно? После установки мне нужно как-то «запустить» этот ресивер? Потому что, когда я устанавливаю, я получаю

  [2010-11-07 21:24:41 - SMSBroadcastReceiver] No Launcher activity found! [2010-11-07 21:24:41 - SMSBroadcastReceiver] The launch will only sync the application package on the device! 

Поэтому мне интересно, что-то здесь не так.

android.provider.Telephony.SMS_RECEIVED имеет капитал T , а ваш в манифесте нет.

Пожалуйста, имейте в виду, что это действие Intent не задокументировано.

Я пробовал ваш код и обнаружил, что он не работает.

Мне пришлось изменить

 if (intent.getAction() == SMS_RECEIVED) { 

в

 if (intent.getAction().equals(SMS_RECEIVED)) { 

Теперь он работает. Это просто проблема с проверкой соответствия Java.

Также обратите внимание, что приложение Hangouts в настоящее время блокирует мой BroadcastReceiver от получения SMS-сообщений. Мне пришлось отключить функциональность SMS в приложении Hangouts (Настройки-> SMS-> Включить SMS), прежде чем мой SMS BroadcastReceived начнет получать увольнение.

Изменить: Кажется, что некоторые приложения будут прерватьBroadcast () в намерении, которое не позволит другим приложениям получать намерение. Решение состоит в том, чтобы увеличить атрибут android:priority в теге intent-filter :

       

Подробнее см. Здесь. Включение поддержки SMS в Hangouts 2.0 приводит к перерыву BroadcastReceiver SMS_RECEIVED в моем приложении

одна важная вещь, которую следует упомянуть в этой теме, – это описание aboud pdu
PDU представляет собой «блок описания протокола» , который является отраслевым форматом для SMS-сообщения. потому что SMSMessage читает / записывает их, вам не нужно их вскрывать.
Большое сообщение может быть разбито на многие, поэтому он представляет собой массив объектов.

intent.getAction().equals(SMS_RECEIVED)

Я пробовал это успешно.

Наткнулся на это сегодня. Для тех, кто сейчас кодирует приемник SMS, используйте этот код вместо устаревшего в OP:

  SmsMessage[] msgs = Telephony.Sms.Intents.getMessagesFromIntent(intent); SmsMessage smsMessage = msgs[0]; 

Ваш широковещательный приемник должен указать android:exported="true" для приема трансляций, созданных вне вашего собственного приложения. Мой вещательный приемник определен в манифесте следующим образом:

      

Как отмечено ниже, exported = “true” является значением по умолчанию, поэтому вы можете опустить эту строку. Я оставил его, чтобы комментарии обсуждения имели смысл.

Для android 19+ вы можете получить его в Telephony.Sms.Intents.SMS_RECEIVED_ACTION) . В classе Intent есть больше, что стоит посмотреть на

android.provider.telephony.SMS_RECEIVED , потому что Telephony – это class, и он должен быть капиталом, как в android.provider.Telephony.SMS_RECEIVED

Обновленный код:

  private class SMSReceiver extends BroadcastReceiver { private Bundle bundle; private SmsMessage currentSMS; private String message; @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) { bundle = intent.getExtras(); if (bundle != null) { Object[] pdu_Objects = (Object[]) bundle.get("pdus"); if (pdu_Objects != null) { for (Object aObject : pdu_Objects) { currentSMS = getIncomingMessage(aObject, bundle); String senderNo = currentSMS.getDisplayOriginatingAddress(); message = currentSMS.getDisplayMessageBody(); Toast.makeText(OtpActivity.this, "senderNum: " + senderNo + " :\n message: " + message, Toast.LENGTH_LONG).show(); } this.abortBroadcast(); // End of loop } } } // bundle null } } private SmsMessage getIncomingMessage(Object aObject, Bundle bundle) { SmsMessage currentSMS; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { String format = bundle.getString("format"); currentSMS = SmsMessage.createFromPdu((byte[]) aObject, format); } else { currentSMS = SmsMessage.createFromPdu((byte[]) aObject); } return currentSMS; } 

более старый код:

 Object [] pdus = (Object[]) myBundle.get("pdus"); messages = new SmsMessage[pdus.length]; for (int i = 0; i < messages.length; i++) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { String format = myBundle.getString("format"); messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i], format); } else { messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); } strMessage += "SMS From: " + messages[i].getOriginatingAddress(); strMessage += " : "; strMessage += messages[i].getMessageBody(); strMessage += "\n"; } 

Простой код SYINTax:

 private class SMSReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Telephony.Sms.Intents.SMS_RECEIVED_ACTION)) { SmsMessage[] smsMessages = Telephony.Sms.Intents.getMessagesFromIntent(intent); for (SmsMessage message : smsMessages) { // Do whatever you want to do with SMS. } } } } 
  • Положите прогрессBar на ActionBar
  • Частичное аннулирование в пользовательском представлении Android с аппаратным ускорением
  • Неявное намерение удалить приложение?
  • Как получить отправителя намерения?
  • Удалите все неиспользуемые ресурсы из проекта Android
  • Android маршрутизирует маршрут по карте с двумя POI-s
  • Как обрабатывать backPress с помощью fragmentа
  • Ошибка Android
  • Android - вытащить Android-устройство SQlite
  • Android SDK: получить изображение предварительного просмотра камеры без его отображения
  • Ошибка разрешения хранилища в Marshmallow
  • Давайте будем гением компьютера.