2014-07-14 28 views
0

我有一些代碼的問題,需要一些幫助。我在這裏的代碼發送文本...但我遇到的問題是接收文本ALWAYS的代碼返回RESULT_OK ...我可以關閉手機/嘗試一個我知道不是真實的數字,它會一直返回RESULT_OK ...任何人都可以幫助我在正確的方向,是否有明顯的錯誤?我使用了錯誤的代碼嗎?任何幫助將是偉大的!由於Android - 文本交付總是返回結果確定

的代碼時,我收到文本:

塊引用

Globals.GlobalContext.registerReceiver(new BroadcastReceiver() 
    { 
     @Override 
     public void onReceive(Context context, Intent arg1) 
     { 
      switch (getResultCode()) 
      { 
      case Activity.RESULT_OK: 
       Globals.UpdateStatus("Message was delivered"); 
       Bundle extras = arg1.getExtras(); 
       if (extras != null) 
       { 
        arg1.getStringExtra("smsNumber"); 
        String number = arg1.getStringExtra("smsNumber"); 
        Globals.UpdateStatus("Delivered to :" + number); 
        arg1 = null; 
       } 
       else 
       { 
        Globals.UpdateStatus("Sent to a number that I don't know :("); 
       } 

       break; 
      case Activity.RESULT_CANCELED: 
       Globals.UpdateStatus("Message was NOT delivered"); 
       break; 
      } 

     } 

    }, new IntentFilter(DELIVERED)); 

發送我的文字代碼:

public void SendTextMessageDelivery(String number, String Message) 
{ 
    if ((CheckValidPhoneNumber(number)) && (Message.length() != 0)) 
    { 
     if (!CheckSMSManager()) 
     { 
      StartSMSManager(true); 
     } 



     //sent 
     PendingIntent sentPI = PendingIntent.getBroadcast(Globals.GlobalContext, 0, new Intent(SENT), 0); 
     ArrayList<PendingIntent> sentIntents = new ArrayList<PendingIntent>(); 
     sentIntents.add(sentPI); 

     //delivered 
     Intent DeliveredIntent = new Intent(DELIVERED); 
     DeliveredIntent.putExtra("smsNumber", number); 

     PendingIntent DeliveredPI = PendingIntent.getBroadcast(Globals.GlobalContext, 0, DeliveredIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
     ArrayList<PendingIntent> DeliveredIntents = new ArrayList<PendingIntent>(); 
     DeliveredIntents.add(DeliveredPI); 

     ArrayList<String> mSMSMessage = smsManager.divideMessage(Message); 
     for (int i = 0; i < mSMSMessage.size(); i++) 
     { 

     } 
     smsManager.sendMultipartTextMessage(number, null, mSMSMessage, sentIntents, DeliveredIntents); 
    } 
    else 
    { 
     if (Message.length() != 0) 
     { 
      Globals.UpdateStatus("Message was not long enough!"); 
     } 
     else 
     { 
      Globals.UpdateStatus("Failed to Validate Mobile Number"); 
     } 
    } 
} 

回答

1

有幾個原因你可能會得到不正確的結果。首先也是最重要的:檢查getResultCode()不是確定交付成功或失敗的正確方法。儘管許多示例使用此方法,但真正的結果將發生在從服務中心返回的SMS狀態消息中,並傳遞到Receiver。

交給您Receiver的Intent將附加一個PDU作爲附加。必須由此創建一個SmsMessage,並且從其getStatus()方法返回的值將是實際結果。例如,您的交付結果Receiver可能類似於以下內容(儘管將額外手工交給Service進行處理會更好)。

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Build; 
import android.provider.Telephony; 
import android.telephony.SmsMessage; 

public class DeliveryResultReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     SmsMessage sms = null; 

     byte[] pdu = intent.getByteArrayExtra("pdu"); 
     String format = intent.getStringExtra("format"); 

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && format != null) { 
      sms = SmsMessage.createFromPdu(pdu, format); 
     } 
     else { 
      sms = SmsMessage.createFromPdu(pdu); 
     } 

     int statusCode = sms.getStatus(); 
     String status = translateDeliveryStatus(statusCode); 
     ... 
    } 

    String translateDeliveryStatus(int statusCode) { 
     switch (statusCode) { 
      case Telephony.Sms.STATUS_COMPLETE: 
       return "Sms.STATUS_COMPLETE"; 
      case Telephony.Sms.STATUS_FAILED: 
       return "Sms.STATUS_FAILED"; 
      case Telephony.Sms.STATUS_PENDING: 
       return "Sms.STATUS_PENDING"; 
      case Telephony.Sms.STATUS_NONE: 
       return "Sms.STATUS_NONE"; 
      default: 
       return "Unknown status code"; 
     } 
    } 
} 

如果在執行此操作後,你仍然得到誤報,那麼它可能是由於你如何定義運營商「交付」。交付可能並不意味着交付給目標設備。確切的行爲會因提供者而異,甚至會直到服務中心級別。以下可能不是來自best source,但把它儘量簡潔,我看到:

一些供應商允許用戶請求發送報告,或者通過短信設置最現代化的手機,或由每種前綴帶* 0#或* N#的訊息。然而,確認的確切含義從到達網絡,到排隊等候發送,發送,接收來自目標設備的接收確認,並且用戶經常不知道所報告的特定成功類型的確切意義。