【发布时间】:2016-10-01 04:03:53
【问题描述】:
我在一次对话中收到两次相同的消息。
也许,我的接收器有问题。
请帮我找一下好吗?
public class SmsReceiver extends BroadcastReceiver {
private final String TAG = "MessagingReceiver";
private Context mContext;
private SharedPreferences mPrefs;
private String mAddress;
private String mBody;
private long mDate;
private Uri mUri;
public static final String SMS_URI = "content://sms";
public static final Uri RECEIVED_MESSAGE_CONTENT_PROVIDER = Uri.parse("content://sms/inbox");
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG, "onReceive");
abortBroadcast();
mContext = context;
mPrefs = PreferenceManager.getDefaultSharedPreferences(context);
if (intent.getExtras() != null) {
Object[] pdus = (Object[]) intent.getExtras().get("pdus");
SmsMessage[] messages = new SmsMessage[pdus.length];
for (int i = 0; i < messages.length; i++) {
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
}
SmsMessage sms = messages[0];
if (messages.length == 1 || sms.isReplace()) {
mBody = sms.getDisplayMessageBody();
} else {
StringBuilder bodyText = new StringBuilder();
for (SmsMessage message : messages) {
bodyText.append(message.getMessageBody());
}
mBody = bodyText.toString();
}
mAddress = sms.getDisplayOriginatingAddress();
mDate = sms.getTimestampMillis();
addMessageToInbox(mContext, mAddress, mBody, mDate);
}
}
public static Uri addMessageToInbox(Context context, String address, String body, long time) {
ContentResolver contentResolver = context.getContentResolver();
ContentValues cv = new ContentValues();
cv.put("address", address);
cv.put("body", body);
cv.put("date_sent", time);
return contentResolver.insert(RECEIVED_MESSAGE_CONTENT_PROVIDER, cv);
}
}
清单.xml
<receiver android:name=".SmsReceiver"
android:permission="android.permission.BROADCAST_SMS">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
【问题讨论】:
-
您是否检查过 onReceive() 是否被调用了两次?放置一些日志消息并检查 onReceive() 是否被调用了两次......另外,在您定义意图过滤器的地方分享您的清单
-
还有一点:打印onReceive中收到的action: "Log.d("TEST", intent.getAction());"这样,您可以查看您是否收到两次相同的操作...或者该操作是否不同...检查您是否仅在清单(意图过滤器)中注册您的广播,或者您是否注册了两次
-
太好了.. 让我们检查一下您在 onReceive() 中收到的操作(另外,分享您的 manifest.xml - 只是您定义意图过滤器的部分)
-
请分享结果 :) 添加调试消息后日志中打印的内容