2017-08-21 44 views
0

我有下面的代碼,我想知道哪些短信已經發送或沒有。 我的代碼每30秒發送一次1-5 sms,所以當吐司「sms not delivered」出現時,我不知道哪一個沒有發送。我不知道這是否是這樣做的正確的方式,但它是對這個問題如何找出哪些短信尚未發送或發送?

public boolean sendSMS(String id, String num, String msg) { 
    String SENT = "SMS_SENT"; 
    String DELIVERED = "SMS_DELIVERED"; 

    PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(
      SENT), 0); 

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

    registerReceiver(sendBroadcastReceiver, new IntentFilter(SENT)); 

    registerReceiver(deliveryBroadcastReciever, new 
IntentFilter(DELIVERED)); 
    SmsManager smsManager = SmsManager.getDefault(); 
    smsManager.sendTextMessage("xxxxxxxx", null, msg, sentPI, deliveredPI); 

    Log.e("Message Sent", num + " " + msg + " " + id); 

    return true; 
} 


class DeliverReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent arg1) { 


     switch (getResultCode()) { 
      case Activity.RESULT_OK: 
       Toast.makeText(getBaseContext(), "sms delivered", 
         Toast.LENGTH_SHORT).show(); 
       break; 
      case Activity.RESULT_CANCELED: 
       Toast.makeText(getBaseContext(), "sms not delivered", 
         Toast.LENGTH_SHORT).show(); 
       break; 
     } 

    } 
} 

class SentReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent arg1) { 
     switch (getResultCode()) { 
      case Activity.RESULT_OK: 
       Toast.makeText(getBaseContext(), "sms sent", Toast.LENGTH_SHORT) 
         .show(); 
       break; 
      case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
       Toast.makeText(getBaseContext(), "Generic failure", 
         Toast.LENGTH_SHORT).show(); 
       break; 
      case SmsManager.RESULT_ERROR_NO_SERVICE: 
       Toast.makeText(getBaseContext(), "No service", 
         Toast.LENGTH_SHORT).show(); 
       break; 
      case SmsManager.RESULT_ERROR_NULL_PDU: 
       Toast.makeText(getBaseContext(), "Null PDU", 
     Toast.LENGTH_SHORT) 
         .show(); 
       break; 
      case SmsManager.RESULT_ERROR_RADIO_OFF: 
       Toast.makeText(getBaseContext(), "Radio off", 
         Toast.LENGTH_SHORT).show(); 
       break; 
     } 

    } 

我爲我的英語不好對不起最常見的解決方案。

編輯:

public boolean sendSMS(String id, String num, String msg) { 
    String SENT = "SMS_SENT"; 
    String DELIVERED = "SMS_DELIVERED"; 

    PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(
      SENT), 0); 

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

    registerReceiver(sendBroadcastReceiver, new IntentFilter(SENT)); 

    registerReceiver(deliveryBroadcastReciever, new IntentFilter(DELIVERED)); 

    smsManager.sendTextMessage("+xxxxxxxxxx", null, msg, sentPI, deliveredPI); 

    Log.e("Message Sent", num + " " + msg + " " + id); 

    return true; 
} 


public class DeliverReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     final Bundle bundle = intent.getExtras(); 

     try { 

      if (bundle != null){ 
       final Object[] bObject = (Object[]) bundle.get("pdus"); 

       for (int i = 0; i < bObject.length; i++){ 

        SmsMessage current = SmsMessage.createFromPdu((byte[]) bObject[i]); 
        String phoneNum = current.getDisplayOriginatingAddress(); 
       } 
      } 
     }catch (Exception e){ 
      Log.e("Deliver Reciever",e.toString()); 
     } 
    } 
} 

調試截圖:http://imgur.com/a/GulgP

回答

0

首先,讓你的SmSManager靜態類對象。然後,您可以從隱藏在intent對象內的PDU獲取當前電話號碼/電話號碼。

final SmsManager sms = SmsManager.getDefault(); 

public void onReceive(Context context, Intent intent) { 
    final Bundle bundle = intent.getExtras(); 
    String phone = ""; 
    SmsMessage smsMessage; 

    try { 

     if (bundle != null) { 

      final Object[] pdu = (Object[]) bundle.get("pdu"); 

      for (int i = 0; i < pdu.length; i++) { 

       smsMessage = SmsMessage.createFromPdu((byte[]) pdu[i]); 
       phone = current.getDisplayOriginatingAddress(); 
      } 
     } 
    } 
} 
+0

還有一個問題。當我嘗試獲取PDU時,它會拋出NullPointerException,因爲Object爲null。這是爲什麼發生? PS。感謝您的幫助 –

+0

您可以將您的原始代碼附加到您所做的修改中嗎? –

+0

也可以在該行上放置一個斷點,併發布該捆綁對象在該點上的位置? –