2012-03-14 36 views
3

我一直在開發一個發送短信的應用程序。我遇到的問題是sendTextMessage方法發送兩個具有相同內容的消息。我如何解決這個問題?Android sendTextMessage在exceution上發送兩條相同的消息

該類啓動過程

public class C2DMMessageReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     //Some stuff 
     Log.i("C2DMMessageReceiver", "Got C2DM message"); 
     SmsSend message = new SmsSend(context, phonenumber, line); 
     message.send() 
    } 
} 

類發送短信

public class SmsSend { 
    SmsSend(Context tcontext, String phoneNumber, String smstext){ 
     context = tcontext; 
     phone_number = phoneNumber; 
     message = smstext; 
    } 

    protected void send(){ 

     if(foo){ 
      Log.i("SmsSend", "Sending message"); 
      SmsManager sms = SmsManager.getDefault(); 
      String sent = "android.telephony.SmsManager.STATUS_ON_ICC_SENT"; 
      PendingIntent piSent = PendingIntent.getBroadcast(context, 0, new Intent(sent), 0); 
      sms.sendTextMessage(phone_number, null, message, piSent, null); 
     } 

    } 
} 

類來找出什麼happining

public class SmsSentBroadcastReciever extends BroadcastReceiver{ 
    private static final String TAG = "SmsSentBroadcastReciever"; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     switch (getResultCode()){ 
      case Activity.RESULT_OK: 
       Log.i(TAG,"SMS sent"); 
       break; 
      case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
       Log.e(TAG,"Generic failure"); 
       break; 
      case SmsManager.RESULT_ERROR_NO_SERVICE: 
       Log.e(TAG,"No service"); 
       break; 
      case SmsManager.RESULT_ERROR_NULL_PDU: 
       Log.e(TAG,"PDU NULL"); 
       break; 
      case SmsManager.RESULT_ERROR_RADIO_OFF: 
       Log.e(TAG,"Radio off"); 
       break; 
     } 

    } 

} 

從logcat的輸出是

了C2DM消息

發送消息

短信發送

短信發送

所以sendTextMessage僅觸發一次,但它仍然拋出兩個消息。該怎麼辦?

我正在調試的設備是Android 4.0的三星Galaxy S2。我閱讀了一些老的線程,sendTextMessage在某些(HTC)設備上壞了,所以我嘗試了sendMultipartTextMessage,但它給出了相同的結果。

+0

嘗試打印您在SmsSentBroadcastReciever得到的意圖。也許你得到超出你的預期 – zapl 2012-03-14 16:51:39

+0

我只是得到2倍意圖{act = android.telephony.SmsManager.STATUS_ON_ICC_SENT flg = 0x10 cmp = com.my.android.app.thisapp /。SmsSentBroadcastReciever} – daker 2012-03-14 17:13:04

+0

如果刪除PendingIntent會發生什麼?也許'SmsManager'會發送廣播以及你指定的Intent。 – zapl 2012-03-14 17:17:55

回答

0

此代碼將在活動返回時打印出「短信發送」,而不是實際發送短信時。

public void onReceive(Context context, Intent intent) { 
    switch (getResultCode()){ 
     case Activity.RESULT_OK: 
      Log.i(TAG,"SMS sent"); 
      break; 

因此,可能發生的事情是,您正在運行的另一活動正在退出,然後返回RESULT_OK。我不知道,因爲我可以看到你如何設置你的廣播接收器來接收。

問題是上述答案中報告的固件。

+0

嗯......好的。接收者看起來像 daker 2012-03-14 17:17:58

+0

這個答案其實是不正確的。 [SmsManager的文檔](http://developer.android.com/reference/android/telephony/SmsManager.html)說,如果SMS發送正確,返回的結果是'Activity.RESULT_OK'。接收者不會接收來自活動返回的意圖,因爲它沒有設置爲接收這些意圖。 – MCeley 2014-03-12 16:32:08

1

固件(LPQ)專門針對Galaxy S2,在所有第三方應用(包括Handcent,GO SMS等)上發送短消息兩次,但股票消息應用除外。我認爲最新版本的固件LP7修復了重複的發送短信問題。你可以驗證手機上的固件版本嗎?

Handcent & GO短信已找到自己的解決方法,並將其升級到市場。

+1

這是正確的。我做了一個錯誤報告,一旦更新可用,一切都會好的。 – daker 2012-04-01 10:26:26

+0

@daker能否獲得此報告的鏈接以及有關此固件的更多信息 – 2012-04-01 18:02:27

+0

sry about delay。在這裏:http://code.google.com/p/android/issues/detail?id = 26953 – daker 2012-04-17 21:23:18

3

下面的代碼工作正常,S2與ICS:

void sendMessageGTI9100ICS(String number, String msg) throws Exception { 
    SmsManager m = SmsManager.getDefault(); 

    Class aclass[] = new Class[9]; 

    aclass[0] = String.class; 
    aclass[1] = String.class; 
    aclass[2] = ArrayList.class; 
    aclass[3] = ArrayList.class; 
    aclass[4] = ArrayList.class; 
    aclass[5] = Boolean.TYPE; 
    aclass[6] = Integer.TYPE; 
    aclass[7] = Integer.TYPE; 
    aclass[8] = Integer.TYPE; 

    Method method = m.getClass().getMethod("sendMultipartTextMessage", aclass); 

    Object aobj[] = new Object[9]; 
    aobj[0] = number; 
    aobj[1] = null; 
    aobj[2] = m.divideMessage(msg); 
    aobj[3] = null; 
    aobj[4] = null; 
    aobj[5] = Boolean.valueOf(false); 
    aobj[6] = Integer.valueOf(0); 
    aobj[7] = Integer.valueOf(0); 
    aobj[8] = Integer.valueOf(0); 

    method.invoke(m, aobj); 
} 
+0

您能否向我解釋一下,爲什麼你要使用9個參數作爲aclass。當我檢查「sendMultipartTextMessage」參數的數量只有5個,所以上面的例子沒有找到提到的方法。但是當我刪除5,6,7和8的參數時,它會發現它。我很困惑。 – bajicdusko 2012-05-28 18:54:58

+0

這是重寫的方法,它不是公共API的一部分,但它可以通過反射訪問。 – lstipakov 2012-05-29 06:51:16

2

我已經創建了一個解決使用貝加爾針茅,以及代碼的答覆,使其在HTC紋身而努力這一問題小的Android庫項目以確保基於設備選擇正確的實施。

https://github.com/nadam/compatibility-sms-manager

+0

這對我有用!那麼,三星版本現在只發送短信一次。我不能擔保非三星版本,但它看起來不錯。謝謝! – 2012-12-04 06:25:31