我注册了BroadcastReceiver android.provider.Telephony.SMS_RECEIVED.
有时,BroadcastReceiver onReceive在同一条SMS上被调用两次.
这是为什么?
我究竟做错了什么?
private void initSmsReceivers() {
smsReceiver = new SmsReceiver();
getActivity().registerReceiver(smsReceiver,
new IntentFilter("android.provider.Telephony.SMS_RECEIVED"));
}
public class SmsReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// ---get the SMS message passed in---
Bundle bundle = intent.getExtras();
SmsMessage[] msgs = null;
String str = "";
if (bundle != null) {
// ---retrieve the SMS message received---
Object[] pdus = (Object[]) bundle.get("pdus");
msgs = new SmsMessage[pdus.length];
for (int i = 0; i < msgs.length; i++) {
msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
// str += "SMS from " + msgs[i].getOriginatingAddress();
// str += " :";
str += msgs[i].getMessageBody().toString();
}
// ---display the new SMS message---
String output = CryptoUtils.decrypt(str);
Toast.makeText(context, output, Toast.LENGTH_LONG).show();
try {
parsemessage(output);
} catch (JSONException e) {
// TODO Auto-generated catch block
Log.e("JSON2", e.toString());
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在执行操作之前通过过滤解决了我的问题。在我的情况下,接收器被调用两次,因为我有两个意图过滤器“SMS_DELIVER”和“SMS_RECEIVED”。请参阅下面的示例
在我的清单中
<receiver
android:name=".SmsReceiver"
android:exported="true"
android:permission="android.permission.BROADCAST_SMS" >
<intent-filter>
<action android:name="android.provider.Telephony.SMS_DELIVER" />
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
广播接收器
public class SmsReceiver extends BroadcastReceiver {
String TAG = "SmsReceiver";
String sender, text;
private static final String ACTION_SMS_NEW = "android.provider.Telephony.SMS_DELIVER";
@Override
public void onReceive(Context context, Intent intent) {
// ---get the SMS message passed in---
Bundle bundle = intent.getExtras();
if (bundle != null) {
// ---retrieve the SMS message received---
Object[] pdus = (Object[]) bundle.get("pdus");
SmsMessage[] msgs = new SmsMessage[pdus.length];
for (int i = 0; i < msgs.length; i++) {
msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
sender = msgs[i].getOriginatingAddress();
text += msgs[i].getMessageBody().toString();
Log.i(TAG, sender + " sender\ntext " + text);
}
final String action = intent.getAction();
Log.d(TAG, "onReceive(context, " + action + ")");
if (ACTION_SMS_NEW.equals(action)) {
ContentValues values = new ContentValues();
values.put("address", sender);
values.put("body", text);
context.getContentResolver().insert(
Uri.parse("content://sms/inbox"), values);
MiscMethods.delay(10);
}
}
}
Run Code Online (Sandbox Code Playgroud)
}
您可能会以编程方式和 静态方式注册广播接收器。因此,请确保它initSmsReceivers被调用一次,并且在您的清单中您不会重新注册该接收器!
以下是在清单中静态注册短信接收器的方法:
<receiver
android:name="your.package.SmsReceiver"
android:exported="true"
android:permission="android.permission.BROADCAST_SMS" >
<intent-filter android:priority="999" >
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1387 次 |
| 最近记录: |