2011-10-26 6 views
0

다른 Android 또는 Android 이외의 휴대 전화로 SMS를 전송하는 앱이 있습니다. 연락처를 선택하거나 입력 할 수 있습니다. 그러나 문제는 그것이 SMS를 보내는 곳으로 갈 때 충돌이 계속 발생한다는 것입니다.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);    
    } 
} 

및을 heres 로그 캣 : 문제가 여기에 무엇을

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이와 나를 위해 제대로 작동합니다. 나는 당신이 그렇게 할 때 왜 그런 도움이되지 않는 메시지를 얻었는지 정말로 모르지만 그것이 그 방법 인 것처럼 보인다. sendMultipartTextMessage에 대한 전체 코드는 무엇을,

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

아무런 변화가 없습니다 : – kev

+0

예 : – Craigy

+0

으로 답을 편집했습니다. 현재 잘 작동하지만 토스트가 나타나지 않으므로 메시지가 보내지는지 알 수 없습니다. – kev

관련 문제