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”是默认值,所以你可以省略这一行。 我已经把它留下来,以便讨论意见是有道理的。