2014-03-01 34 views
3

我为android.provider.Telephony.SMS_RECEIVED注册了BroadcastReceiver。为什么有时SMS BroadcastReceiver被调用两次?

有时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()); 
      } 

     } 
    } 
} 
+3

你有没有注册这个接收器或者叫'initSmsReceivers()'别的地方在你的代码? –

+1

你怎么知道它被调用两次? – mangusta

+0

@Lisa Anne你修好了吗?我现在也面临同样的问题.. – Ranjit

回答

1

这可能是因为你正在注册的广播接收器都编程,并静态的情况。所以请确保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> 
0

我解决我的做动作之前过滤。在我的情况下,接收被称为两次,因为我有两个意图过滤器“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> 

广播接收机

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); 
     } 
    } 

} 

}

0

onReceive()过滤器的意图行动:

if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED"){ 
     //handle received sms 
} 
else if(intent.getAction().equals("android.provider.Telephony.SMS_DELIVER"){ 
     //do something 
} 
相关问题