Android – 短信广播接收器

我一直试图让这个程序工作,但迄今没有运气。 我无法找到我在做错的地方。 我不确定代码是否有问题,或调试。

如果有新的短信到达,我正在通知您。

这是我的程序:

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> 

我通过Telnet发送短信,在logcat中看不到任何Intent收到的消息。 这是我从安装时的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 

所以短信似乎被模拟器收到,但看起来没有意图发射。 我在这里做错了什么? 安装后,我必须以某种方式“启动”这个接收器? 因为当我安装,我得到

  [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有一个大写android.provider.Telephony.SMS_RECEIVED T ,而你的清单中没有。

请记住,这种Intent行动没有记录。

我试过你的代码,发现它不工作。

我必须改变

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

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

现在它正在工作。 这只是java检查平等的问题。

这个线程应该提到的一个重要的事情是描述为pdu
PDU是“协议描述单元” ,它是SMS消息的行业格式。 因为SMSMessage读/写他们你不应该需要解剖他们。
大量的信息可能被分解成许多,这就是为什么它是一个对象数组。

intent.getAction().equals(SMS_RECEIVED)

我已经成功地尝试过了。

另外请注意,环聊应用程序目前会阻止我的BroadcastReceiver接收短信。 我必须在环聊应用程序(设置 – >短信 – >打开短信)中禁用短信功能,然后再开始短信广播接收。

编辑:它看起来好像有些应用程序将abortBroadcast()的意图,这将阻止其他应用程序接收意图。 解决方法是增加intent-filter标记中的android:priority属性:

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

在此处查看更多详情: 在环聊2.0中启用短信支持会在我的应用中打破SMS_RECEIVED的BroadcastReceiver

今天偶然发现 对于现在编码SMS接收器的任何人,请使用此代码,而不是在OP中弃用:

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

对于Android 19+,您可以在Telephony.Sms.Intents.SMS_RECEIVED_ACTION)获取它。 Intent班有更多值得关注的课程

android.provider.telephony.SMS_RECEIVED是不正确的,因为电话是一个类,它应该是在android.provider.Telephony.SMS_RECEIVED

您的广播接收机必须指定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> 

如下所述,export =“true”是默认值,所以你可以省略这一行。 我已经把它留下来,以便讨论意见是有道理的。