2010-11-07 4 views
46

Я пытался получить программу this для работы, но пока не повезло. Я не могу найти, где я поступаю неправильно. Я не уверен, что что-то не так с кодом или отладки.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 < pdus.length; i++) { 
          messages[i] = SmsMessage.createFromPdu((byte[])pdus[i]); 
         } 
         if (messages.length > -1) { 
          Log.i(TAG, "Message recieved: " + messages[0].getMessageBody()); 
         } 
        } 
       } 
      } 
    } 

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

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="Technicaljar.SMSBroadcastReceiver" 
     android:versionCode="1" 
     android:versionName="1.0"> 
    <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true" > 
     <receiver android:name=".SMSBroadcastReceiver"> 
      <intent-filter> 
       <action android:name="android.provider.telephony.SMS_RECEIVED"></action> 
      </intent-filter> 
     </receiver> 

    </application> 
    <uses-sdk android:minSdkVersion="7" /> 
    <uses-permission android:name="android.permission.INTERNET"></uses-permission> 
    <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission> 
</manifest> 

Я посылаю 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! 

Так мне интересно, если что-то здесь не так.

+0

Я что-то подобное ЗДЕСЬ !!! http://stackoverflow.com/questions/14452808/sending-and-receiving-sms-mms-in-android – toobsco42

+0

Вы не должны использовать 'намерение.getAction(). equals (SMS_RECEIVED)' вместо 'intent.getAction() == SMS_RECEIVED' – peter

ответ

62

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

Обратите внимание, что действие Intent не задокументировано.

+1

Большое спасибо CommonsWare. Это была проблема. Теперь он отлично работает. Спасибо. Кроме того, могу ли я спросить, почему это намерение не задокументировано? – madu

+1

@madu: Я понятия не имею. – CommonsWare

+0

Я не знал, что это не задокументировано. Я вижу много людей, использующих это намерение, я никогда не думал, что это не документировано. Спасибо Вам за информацию. – madu

3

intent.getAction().equals(SMS_RECEIVED)

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

16

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

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

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

в

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

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

+4

FYI: его всегда лучше вызывать .equals (..) из непустой строки. например, если (SMS_RECEIVED.equals (intent.getAction())) { – Yaadm

0

android.provider.telephony.SMS_RECEIVED не является правильным, потому что Телефония является классом, и он должен быть капитал, как в android.provider.Telephony.SMS_RECEIVED

1

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

<receiver 
    android:name=".IncomingSmsBroadcastReceiver" 
    android:enabled="true" 
    android:exported="true" > 
    <intent-filter> 
     <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
    </intent-filter> 
</receiver> 

Как отмечено ниже, экспортируемый = «истина» по умолчанию, так что вы можете пропустить эту строку. Я оставил его, чтобы комментарии обсуждения имели смысл.

+2

Нет. Когда получатель имеет фильтр намерений, он автоматически экспортируется. См. Http://developer.android.com/guide/topics/manifest/receiver-element.html#exported –

+0

Простой комментарий.Я подозреваю, что это, возможно, изменилось в последней версии Android, мой код был первоначально разработан для Android 4.0. Я обновлю ответ. – Phil

3

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

2

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

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

<receiver android:name="com.company.application.SMSBroadcastReceiver" > 
     <intent-filter android:priority="500"> 
      <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
     </intent-filter> 
    </receiver> 

Смотреть подробнее здесь: Enabling SMS support in Hangouts 2.0 breaks the BroadcastReceiver of SMS_RECEIVED in my app

+1

http://android-developers.blogspot.no/2011/01/processing-ordered-broadcasts.html <- Прочитайте часть о поиске изменений, сделанных другими приложениями, а также о значении приоритета «0», –

1

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

2

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

SmsMessage[] msgs = Telephony.Sms.Intents.getMessagesFromIntent(intent); 
    SmsMessage smsMessage = msgs[0]; 
Смежные вопросы