2012-03-14 50 views
8

我試圖從Android應用程序發送短信。我正在使用PendingIntent,以便我可以使用廣播接收器來檢查它是否發送正常。由於sendTextMessage呼叫將按每條短信完成,因此我需要發送一些「額外」數據來識別實際的短信,以便我的廣播接收可以針對特定的短信做一些工作。Android PendingIntent額外

這是我送的代碼:

 String SENT = "SMS_SENT"; 

     Intent sentIntent = new Intent(SENT); 
     sentIntent.putExtra("foo", "BAR"); 
     PendingIntent sentPI = PendingIntent.getBroadcast(baseContext, 0, 
      sentIntent, 0); 

     PendingIntent deliveredPI = PendingIntent.getBroadcast(baseContext, 0, 
      new Intent(DELIVERED), 0); 

     SmsManager sms = SmsManager.getDefault(); 
     sms.sendTextMessage(smsMessage.getNumber(), null, smsMessage.getText(), sentPI, deliveredPI); 

的問題是,在我的廣播接收器,它似乎無法閱讀我額外的「富」:

public class SMSSentBroadcastReceiver extends BroadcastReceiver { 

    @Override 
     public void onReceive(Context arg0, Intent intent) { 
     String smsID = intent.getStringExtra("foo"); 
     ...... 
     } 
    } 

SMSID剛剛成爲空。

我的廣播接收器被註冊,像這樣:

baseContext.registerReceiver(new SMSSentBroadcastReceiver(), new IntentFilter("SMS_SENT")); 

鑑於意圖過濾器正在工作,我究竟做錯了什麼?爲什麼沒有發送額外信息?

任何幫助表示讚賞。謝謝

+0

在您的PendingIntent.getBroadcast中,如果您傳遞了一些唯一的請求代碼,那麼smsID仍然爲空? (例如'PendingIntent.getBroadcast(baseContext,99,sentIntent,0)') – dule 2012-03-14 16:35:04

+0

非常好!這工作。如果你把它作爲答案,我會接受:)但是,爲什麼你需要一個唯一的請求代碼?之前,我只是將它設置爲0,這似乎沒有做到。 – jtnire 2012-03-14 16:38:04

回答

14

我懷疑發生了什麼(至少,它發生在我身上),是你在別的地方使用過SMS_SENT意圖,因此當時這個意圖沒有「foo」 。使用相同的意圖和請求代碼調用PendingIntent.getBroadcast將返回原始未決意圖。

如果它實際上意圖是相同的意圖,您需要使用類似PendingIntent.FLAG_UPDATE_CURRENT的東西來更新意圖與新的額外。如果它不是相同的意圖,它應該有一個不同的請求代碼,以便它不符合其他意圖(這就是爲什麼提供唯一的請求代碼工作)。

+0

我100%肯定foo總是被設置爲額外的。但是我可以確認這個「相同的」待處理意圖被調用了兩次,因爲有2條短消息試圖發送。我認爲這實際上可能是一個SDK中的錯誤.... – jtnire 2012-03-14 16:54:14

+0

我不確定爲什麼額外不會總是在那裏(對我來說,它在那裏,但是不正確,即陳舊)。我沒有意識到任何會導致此問題的錯誤,我通常認爲這是我錯過的東西,而不是SDK錯誤:) – dule 2012-03-14 17:39:18

+0

@dule,你太棒了!這個問題已經摺磨了我幾個小時,直到我找到你的答案。 – neevek 2012-03-28 10:06:37