我一直试图让this程序工作,但到目前为止没有运气。我无法找到我做错的地方。我不确定代码或调试是否有问题。
我正在尝试收到新短信的通知。
这是我的计划:
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
所以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 :(得分:70)
android.provider.Telephony.SMS_RECEIVED
有一个大写T
,你的清单中没有。
请注意,此Intent
操作未记录在案。
答案 1 :(得分:17)
我尝试了你的代码,发现它无效。
我不得不改变
if (intent.getAction() == SMS_RECEIVED) {
到
if (intent.getAction().equals(SMS_RECEIVED)) {
现在它正在运作。这只是java检查相等性的一个问题。
答案 2 :(得分:5)
另请注意,环聊应用程序目前会阻止我的BroadcastReceiver接收短信。在我的SMS BroadcastReceived开始被解雇之前,我不得不在环聊应用中禁用短信功能(设置 - &gt;短信 - &gt;开启短信)。
编辑:似乎某些应用程序将在意图上abortBroadcast(),这将阻止其他应用程序接收意图。解决方案是增加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
答案 3 :(得分:3)
intent.getAction().equals(SMS_RECEIVED)
我已成功尝试过。
答案 4 :(得分:2)
您的广播接收器必须指定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>
如下所述,exported =“true”是默认值,因此您可以省略此行。我把它留下来让讨论意见有意义。
答案 5 :(得分:2)
今天偶然发现了这一点。对于现在编码SMS接收器的任何人,请使用此代码而不是OP中弃用的:
SmsMessage[] msgs = Telephony.Sms.Intents.getMessagesFromIntent(intent);
SmsMessage smsMessage = msgs[0];
答案 6 :(得分:1)
对于Android 19+,您可以在Telephony.Sms.Intents.SMS_RECEIVED_ACTION)
中获取它。 Intent
类中还有更多值得关注的内容
在
答案 7 :(得分:1)
更新后的代码为:
x = 34000
self.text_box = QtGui.QPlainTextEdit(self.layoutWidget)
self.text_box.setText(str(x))
旧代码为:
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";
}
答案 8 :(得分:1)
我最近遇到过这样的问题。尽管代码是正确的,但是我没有在应用程序设置中打开权限。因此,默认情况下并未在模拟器上设置所有权限,因此您应该自己进行设置。
答案 9 :(得分:0)
android.provider.telephony.SMS_RECEIVED
不正确,因为Telephony是一个类,它应该是资本,如android.provider.Telephony.SMS_RECEIVED