2011-10-26 97 views
0

我有一個應用程序,發送短信給其他Android或非Android手機。您可以選擇或輸入您的聯繫人。但問題是,當我到達發送SMS的部分時,它會一直崩潰。發送短信時發生崩潰(NullPointerException)我該怎麼辦?

btnRecipient.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       Intent intent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI); 
       startActivityForResult(intent, CONTACT_PICKER_RESULT); 
      } 
     }); 
    } 

    @Override 
    public void onActivityResult(int reqCode, int resultCode, Intent data) { 
     super.onActivityResult(reqCode, resultCode, data); 

     switch (reqCode) { 
      case (CONTACT_PICKER_RESULT): 
       if (resultCode == Activity.RESULT_OK) { 
        Uri contactData = data.getData(); 
        Cursor c = managedQuery(contactData, null, null, null, null); 
        if (c.moveToFirst()) { 
         String name = c.getString(c.getColumnIndexOrThrow(Contacts.DISPLAY_NAME)); 
         editTextRecipient.setText(name); 
        } 
       } 
       break; 
     } 

     btnSend.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       String phoneNo = editTextRecipient.getText().toString(); 
       String message = editTextNewMessage.getText().toString(); 

       if (phoneNo.length()>0 && message.length()>0)     
        sendSMS(phoneNo, message);     
       else 
        Toast.makeText(getBaseContext(), 
         "Please enter both phone number and message.", 
         Toast.LENGTH_SHORT).show(); 
      } 
     });   
    } 

    private void sendSMS(String phoneNo, String message) 
    {  
     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(new BroadcastReceiver(){ 
      @Override 
      public void onReceive(Context arg0, 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; 
       } 
      } 
     }, new IntentFilter(SENT)); 

     registerReceiver(new BroadcastReceiver(){ 
      @Override 
      public void onReceive(Context arg0, 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;      
       } 
      } 
     }, new IntentFilter(DELIVERED));   

     SmsManager sms = SmsManager.getDefault(); 
     sms.sendTextMessage(phoneNo, null, message, sentPI, deliveredPI);    
    } 
} 

和繼承人的logcat:

10-26 12:23:29.633: E/AndroidRuntime(11986): FATAL EXCEPTION: main 
10-26 12:23:29.633: E/AndroidRuntime(11986): java.lang.NullPointerException 
10-26 12:23:29.633: E/AndroidRuntime(11986): at com.android.internal.telephony.gsm.SmsMessage.getSubmitPduHead(SmsMessage.java:663) 
10-26 12:23:29.633: E/AndroidRuntime(11986): at com.android.internal.telephony.gsm.SmsMessage.getSubmitPdu(SmsMessage.java:339) 
10-26 12:23:29.633: E/AndroidRuntime(11986): at android.telephony.SmsMessage.getSubmitPdu(SmsMessage.java:613) 
10-26 12:23:29.633: E/AndroidRuntime(11986): at android.telephony.SmsManager.sendTextMessage(SmsManager.java:228) 
10-26 12:23:29.633: E/AndroidRuntime(11986): at android.telephony.SmsManager.sendTextMessage(SmsManager.java:107) 
10-26 12:23:29.633: E/AndroidRuntime(11986): at android.telephony.gsm.SmsManager.sendTextMessage(SmsManager.java:79) 
10-26 12:23:29.633: E/AndroidRuntime(11986): at com.example.KAHTextApp.KAHTextApp.sendSMS(KAHTextApp.java:136) 
10-26 12:23:29.633: E/AndroidRuntime(11986): at com.example.KAHTextApp.KAHTextApp.access$0(KAHTextApp.java:78) 
10-26 12:23:29.633: E/AndroidRuntime(11986): at com.example.KAHTextApp.KAHTextApp$2.onClick(KAHTextApp.java:69) 
10-26 12:23:29.633: E/AndroidRuntime(11986): at android.view.View.performClick(View.java:2532) 
10-26 12:23:29.633: E/AndroidRuntime(11986): at android.view.View$PerformClick.run(View.java:9293) 
10-26 12:23:29.633: E/AndroidRuntime(11986): at android.os.Handler.handleCallback(Handler.java:587) 
10-26 12:23:29.633: E/AndroidRuntime(11986): at android.os.Handler.dispatchMessage(Handler.java:92) 
10-26 12:23:29.633: E/AndroidRuntime(11986): at android.os.Looper.loop(Looper.java:143) 
10-26 12:23:29.633: E/AndroidRuntime(11986): at android.app.ActivityThread.main(ActivityThread.java:4277) 
10-26 12:23:29.633: E/AndroidRuntime(11986): at java.lang.reflect.Method.invokeNative(Native Method) 
10-26 12:23:29.633: E/AndroidRuntime(11986): at java.lang.reflect.Method.invoke(Method.java:507) 
10-26 12:23:29.633: E/AndroidRuntime(11986): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
10-26 12:23:29.633: E/AndroidRuntime(11986): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
10-26 12:23:29.633: E/AndroidRuntime(11986): at dalvik.system.NativeStart.main(Native Method) 

這裏有什麼問題嗎?以及如何解決這個問題?

回答

4

這看起來與here描述的問題非常相似。

如果將方法調用sendTextMessage替換爲sendMultipartTextMessage是否有效?你能記錄你的變量消息在那個時間點多久了嗎?

編輯:

如此看來,如果你試圖發送超過160個字符的一條SMS消息,你會得到一個空指針異常。爲了避免這種情況,請將消息拆分爲多個部分。下面是一些測試代碼,我寫道:

public void textSingle(View view) { 
    sendSMS("XXXXXXXXXX", "Test", false); 
} 

public void textSingleLong(View view) { 
    sendSMS("XXXXXXXXXX", 
      "TestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTest", 
      false); 
} 

public void textMulti(View view) { 
    sendSMS("XXXXXXXXXX", 
      "TestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTest", 
      true); 
} 

private void sendSMS(String phoneNo, String message, boolean split) { 
    ... 

    SmsManager sms = SmsManager.getDefault(); 
    if (!split) { 
     Log.d("SMSTest", "Sending single message: " + message); 
     sms.sendTextMessage(phoneNo, null, message, sentPI, deliveredPI); 
    } else { 
     Log.d("SMSTest", "Sending '" + message + "' in multiple parts."); 
     ArrayList<String> parts = sms.divideMessage(message); 
     Log.d("SMSTest", parts.size() + " parts:"); 
     for (String string : parts) { 
      Log.d("SMSTest", string); 
     } 
     ArrayList<PendingIntent> sentList = new ArrayList<PendingIntent>(); 
     ArrayList<PendingIntent> deliveredList = new ArrayList<PendingIntent>(); 
     for (int i = 0; i < parts.size(); i++) { 
      sentList.add(sentPI); 
      deliveredList.add(deliveredPI); 
     } 
     sms.sendMultipartTextMessage(phoneNo, null, parts, sentList, 
       deliveredList); 
    } 
} 

我迷上了按鈕,每一種方法,他們正常工作對我來說,有一個NullPointerException當我嘗試發送一個長消息。當你這樣做時,我不知道你爲什麼會得到這樣一個無益的信息,但那似乎是這樣。

+0

什麼也沒有發生,什麼是對sendMultipartTextMessage整個代碼? – kev

+0

我用一個例子編輯我的答案 – Craigy

+0

它現在工作正常,但問題是吐司不會出現,所以我不知道如果郵件發送或不。 – kev

0

做在一行

SmsManager sms = SmsManager.getDefault(); 
ArrayList<String> parts = sms.divideMessage(message); 
sms.sendMultipartTextMessage(phoneNumber, null, parts, null, null);