短信应用程序在发送长消息时出错

时间:2014-04-02 21:35:56

标签: android sms

我从互联网上复制一些代码来创建短信应用程序。它适用于短消息。当我想发送长消息时,我收到错误:

W/dalvikvm(20510): threadid=1: thread exiting with uncaught exception (group=0x40015560)
E/AndroidRuntime(20510): FATAL EXCEPTION: main
E/AndroidRuntime(20510): java.lang.NullPointerException
E/AndroidRuntime(20510):  at android.os.Parcel.readException(Parcel.java:1328)
E/AndroidRuntime(20510):  at android.os.Parcel.readException(Parcel.java:1276)
E/AndroidRuntime(20510):  at com.android.internal.telephony.ISms$Stub$Proxy.sendText(ISms.java:369)
E/AndroidRuntime(20510):  at android.telephony.SmsManager.sendTextMessage(SmsManager.java:87)
E/AndroidRuntime(20510):  at com.example.sendsmsdemo.MainActivity.sendSMS(MainActivity.java:89)
E/AndroidRuntime(20510):  at com.example.sendsmsdemo.MainActivity$1.onClick(MainActivity.java:66)
E/AndroidRuntime(20510):  at android.view.View.performClick(View.java:2485)
E/AndroidRuntime(20510):  at android.view.View$PerformClick.run(View.java:9080)
E/AndroidRuntime(20510):  at android.os.Handler.handleCallback(Handler.java:587)
E/AndroidRuntime(20510):  at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime(20510):  at android.os.Looper.loop(Looper.java:130)
E/AndroidRuntime(20510):  at android.app.ActivityThread.main(ActivityThread.java:3683)
E/AndroidRuntime(20510):  at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(20510):  at java.lang.reflect.Method.invoke(Method.java:507)
E/AndroidRuntime(20510):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
E/AndroidRuntime(20510):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
E/AndroidRuntime(20510):  at dalvik.system.NativeStart.main(Native Method)

申请代码:

package com.example.sendsmsdemo;

import android.os.Bundle;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.telephony.SmsManager;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {
   Button sendBtn;
   EditText txtphoneNo;
   EditText txtMessage;
   BroadcastReceiver sendBroadcastReceiver = new sentReceiver();
   BroadcastReceiver deliveryBroadcastReciever = new deliverReceiver();;


   @Override
   protected void onPause() {
       super.onPause();

       try {
           unregisterReceiver(sendBroadcastReceiver);
           unregisterReceiver(deliveryBroadcastReciever);
       } catch (Exception e) {
           e.printStackTrace();
       }
   }
@Override
protected void onDestroy() {
   super.onDestroy();
   try {
       unregisterReceiver(sendBroadcastReceiver);
       unregisterReceiver(deliveryBroadcastReciever);
   } catch (Exception e) {
       e.printStackTrace();
   }
}

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      sendBtn = (Button) findViewById(R.id.btnSendSMS);
      txtphoneNo = (EditText) findViewById(R.id.editTextPhoneNo);
      txtMessage = (EditText) findViewById(R.id.editTextSMS);

      sendBtn.setOnClickListener(new View.OnClickListener() {
         public void onClick(View view) {

             if (txtphoneNo.getText().toString().equals("")
                     | txtphoneNo.getText().toString().equals(null)) {
                 Toast.makeText(getApplicationContext(), "enter_ph_no", Toast.LENGTH_LONG)
                         .show();
             } else {

                 String msg1 = txtphoneNo.getText().toString();
                 String phn1 = txtMessage.getText().toString();
                 sendSMS(msg1, phn1);

             }

            }
        });

   }
   protected void sendSMS(String phoneNumber, 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(sendBroadcastReceiver, new IntentFilter(SENT));

      registerReceiver(deliveryBroadcastReciever, new IntentFilter(DELIVERED));
      SmsManager sms = SmsManager.getDefault();
      sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);


  }

   class deliverReceiver extends BroadcastReceiver {
       @Override
       public void onReceive(Context context, Intent arg1) {
           switch (getResultCode()) {
           case Activity.RESULT_OK:
               Toast.makeText(getApplicationContext(), "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:
               finish();
               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;
           }           
       }
   }
}

如果有人会找时间帮助我,我会非常感激

更新

我使用了你的代码并且它可以工作:)非常感谢:)

private void sendSMS(String number, String message)
   {
       SmsManager sm = SmsManager.getDefault();        
       ArrayList<String> parts = sm.divideMessage(message);

       String SENT = "SMS_SENT";
       String DELIVERED = "SMS_DELIVERED";

       PendingIntent piSent = PendingIntent.getBroadcast(this, 0, new Intent(
               SENT), 0);
       PendingIntent piDel = PendingIntent.getBroadcast(this, 0,
               new Intent(DELIVERED), 0);

       registerReceiver(sendBroadcastReceiver, new IntentFilter(SENT));

       registerReceiver(deliveryBroadcastReciever, new IntentFilter(DELIVERED));

       if (parts.size() == 1)
       {
           String msg = parts.get(0);
           sm.sendTextMessage(number, null, msg, piSent, piDel);
       }
       else
       {
           ArrayList<PendingIntent> sentPis = new ArrayList<PendingIntent>();      
           ArrayList<PendingIntent> delPis = new ArrayList<PendingIntent>();       

           int ct = parts.size();
           for (int i = 0; i < ct; i++)
           {
               sentPis.add(i, piSent);
               delPis.add(i, piDel);
           }

           sm.sendMultipartTextMessage(number, null, parts, sentPis, delPis);
       }
   }

我还有一个问题。我的部分代码:

switch (getResultCode()) {
   case Activity.RESULT_OK:
   Toast.makeText(getBaseContext(), "sms_sent", Toast.LENGTH_SHORT).show();
   break;

当我发送长信息时(例如长度类似四条信息)我看到吐司&#34; sms_sent&#34;四次。成功发送整条信息后,是否有可能只看到一次吐司?

2 个答案:

答案 0 :(得分:0)

sendMultipartTextMessage()方法可用于发送单部分和多部分消息。如果传递给sendTextMessage()的消息的长度确实导致了NullPointerException,那么这应该有效:

private static final String ACTION_SMS_SENT = "SMS_SENT";
private static final String ACTION_SMS_DELIVERED = "SMS_DELIVERED";
private static final String EXTRA_MESSAGE_PART = "msg_part";

private int sendSms(String number, String message) {
    Intent iSent, iDel;
    PendingIntent piSent, piDel;

    SmsManager sm = SmsManager.getDefault();        
    ArrayList<String> parts = sm.divideMessage(message);
    final int count = parts.size();

    ArrayList<PendingIntent> sentPis = new ArrayList<>(count);      
    ArrayList<PendingIntent> delPis = new ArrayList<>(count);       

    for (int i = 0; i < count; i++) {
        iSent = new Intent(ACTION_SMS_SENT)
                    .putExtra(EXTRA_MESSAGE_PART, i);
        piSent = PendingIntent.getBroadcast(this,
                                            i,
                                            iSent,
                                            PendingIntent.FLAG_ONE_SHOT);
        sentPis.add(piSent);

        iDel = new Intent(ACTION_SMS_DELIVERED)
                   .putExtra(EXTRA_MESSAGE_PART, i);
        piDel = PendingIntent.getBroadcast(this,
                                           i,
                                           iDel,
                                           PendingIntent.FLAG_ONE_SHOT);
        delPis.add(piDel);
    }

    sm.sendMultipartTextMessage(number, null, parts, sentPis, delPis);

    return count;
}

答案 1 :(得分:0)

如果您的短信长度超过160,则会产生错误,好像超过移动设备发送的一个短信的长度