SMS应用给我发长messege错误 [英] sms application gives an error when I send long messege

查看:175
本文介绍了SMS应用给我发长messege错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我复制一些code从互联网上创建SMS应用。它以短信效果很好。当我想发送超长短信,我得到错误:


  W / dalvikvm(20510):主题ID = 1:螺纹未捕获的异常(组= 0x40015560)退出
E / AndroidRuntime(20510):致命异常:主要
E / AndroidRuntime(20510):显示java.lang.NullPointerException
E / AndroidRuntime(20510):在android.os.Parcel.readException(Parcel.java:1328)
E / AndroidRuntime(20510):在android.os.Parcel.readException(Parcel.java:1276)
E / AndroidRuntime(20510):在com.android.internal.telephony.ISms $存根$ Proxy.sendText(ISms.java:369)
E / AndroidRuntime(20510):在android.telephony.SmsManager.sendTextMessage(SmsManager.java:87)
E / AndroidRuntime(20510):在com.example.sendsmsdemo.MainActivity.sendSMS(MainActivity.java:89)
E / AndroidRuntime(20510):在com.example.sendsmsdemo.MainActivity $ 1.onClick(MainActivity.java:66)
E / AndroidRuntime(20510):在android.view.View.performClick(View.java:2485)
E / AndroidRuntime(20510):在android.view.View $ PerformClick.run(View.java:9080)
E / AndroidRuntime(20510):在android.os.Handler.handleCallback(Handler.java:587)
E / AndroidRuntime(20510):在android.os.Handler.dispatchMessage(Handler.java:92)
E / AndroidRuntime(20510):在android.os.Looper.loop(Looper.java:130)
E / AndroidRuntime(20510):在android.app.ActivityThread.main(ActivityThread.java:3683)
E / AndroidRuntime(20510):在java.lang.reflect.Method.invokeNative(本机方法)
E / AndroidRuntime(20510):在java.lang.reflect.Method.invoke(Method.java:507)
E / AndroidRuntime(20510):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:839)
E / AndroidRuntime(20510):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
E / AndroidRuntime(20510):在dalvik.system.NativeStart.main(本机方法)


应用code:

 包com.example.sendsmsdemo;进口android.os.Bundle;
进口android.app.Activity;
进口android.app.PendingIntent;
进口android.content.BroadcastReceiver;
进口android.content.Context;
进口android.content.Intent;
进口android.content.IntentFilter;
进口android.telephony.SmsManager;
进口android.view.View;
进口android.widget.Button;
进口android.widget.EditText;
进口android.widget.Toast;公共类MainActivity延伸活动{
   按钮sendBtn;
   的EditText txtphoneNo;
   的EditText txtMessage;
   广播接收器sendBroadcastReceiver =新sentReceiver();
   广播接收器deliveryBroadcastReciever =新deliverReceiver();;
   @覆盖
   保护无效的onPause(){
       super.onPause();       尝试{
           unregisterReceiver(sendBroadcastReceiver);
           unregisterReceiver(deliveryBroadcastReciever);
       }赶上(例外五){
           e.printStackTrace();
       }
   }
@覆盖
保护无效的onDestroy(){
   super.onDestroy();
   尝试{
       unregisterReceiver(sendBroadcastReceiver);
       unregisterReceiver(deliveryBroadcastReciever);
   }赶上(例外五){
       e.printStackTrace();
   }
}   @覆盖
   保护无效的onCreate(捆绑savedInstanceState){
      super.onCreate(savedInstanceState);
      的setContentView(R.layout.activity_main);      sendBtn =(按钮)findViewById(R.id.btnSendSMS);
      txtphoneNo =(EditText上)findViewById(R.id.editTextPhoneNo);
      txtMessage =(EditText上)findViewById(R.id.editTextSMS);      sendBtn.setOnClickListener(新View.OnClickListener(){
         公共无效的onClick(查看视图){             如果(txtphoneNo.getText()。的toString()。等于()
                     | txtphoneNo.getText()。的toString()。等于(NULL)){
                 Toast.makeText(getApplicationContext(),enter_ph_no,Toast.LENGTH_LONG)
                         。显示();
             }其他{                 。字符串MSG1 = txtphoneNo.getText()的toString();
                 。字符串phn1 = txtMessage.getText()的toString();
                 sendSMS(MSG1,phn1);             }            }
        });   }
   保护无效sendSMS(字符串phoneNumber的,字符串消息){      字符串SENT =SMS_SENT;
      字符串DELIVERED =SMS_DELIVERED;      的PendingIntent sentPI = PendingIntent.getBroadcast(这一点,0,新意图(
              SENT),0);      的PendingIntent deliveredPI = PendingIntent.getBroadcast(这一点,0,
              新意图(交付),0);      registerReceiver(sendBroadcastReceiver,新的IntentFilter(SENT));      registerReceiver(deliveryBroadcastReciever,新的IntentFilter(送到));
      SmsManager短信= SmsManager.getDefault();
      sms.sendTextMessage(phoneNumber的,空,消息,sentPI,deliveredPI);
  }   类deliverReceiver扩展广播接收器{
       @覆盖
       公共无效的onReceive(上下文的背景下,意图ARG1){
           开关(的getResult code()){
           案例Activity.RESULT_OK:
               Toast.makeText(getApplicationContext(),sms_delivered,
                       Toast.LENGTH_SHORT).show();
               打破;
           案例Activity.RESULT_CANCELED:
               Toast.makeText(getBaseContext(),sms_not_delivered,
                       Toast.LENGTH_SHORT).show();
               打破;
           }       }
   }   类sentReceiver扩展广播接收器{
    @覆盖
       公共无效的onReceive(上下文的背景下,意图ARG1){           开关(的getResult code()){
           案例Activity.RESULT_OK:
               完();
               Toast.makeText(getBaseContext(),sms_sent,Toast.LENGTH_SHORT)
                       。显示();
               打破;
           案例SmsManager.RESULT_ERROR_GENERIC_FAILURE:
               Toast.makeText(getBaseContext(),一般故障
                       Toast.LENGTH_SHORT).show();
               打破;
           案例SmsManager.RESULT_ERROR_NO_SERVICE:
               Toast.makeText(getBaseContext(),无服务,
                       Toast.LENGTH_SHORT).show();
               打破;
           案例SmsManager.RESULT_ERROR_NULL_PDU:
               Toast.makeText(getBaseContext(),空的PDU,Toast.LENGTH_SHORT)
                       。显示();
               打破;
           案例SmsManager.RESULT_ERROR_RADIO_OFF:
               Toast.makeText(getBaseContext(),无线电关
                       Toast.LENGTH_SHORT).show();
               打破;
           }
       }
   }
}

如果有人会发现一些时间,帮助我,我会非常感激。

更新:

我用你的code和工程:)感谢很多:)

 私人无效sendSMS(串号,字符串消息)
   {
       SmsManager SM = SmsManager.getDefault();
       ArrayList的<串GT;部分= sm.divideMessage(消息);       字符串SENT =SMS_SENT;
       字符串DELIVERED =SMS_DELIVERED;       的PendingIntent piSent = PendingIntent.getBroadcast(这一点,0,新意图(
               SENT),0);
       的PendingIntent piDel = PendingIntent.getBroadcast(这一点,0,
               新意图(交付),0);       registerReceiver(sendBroadcastReceiver,新的IntentFilter(SENT));       registerReceiver(deliveryBroadcastReciever,新的IntentFilter(送到));       如果(parts.size()== 1)
       {
           弦乐味精= parts.get(0);
           sm.sendTextMessage(数字,空,味精,piSent,piDel);
       }
       其他
       {
           ArrayList的<&的PendingIntent GT; sentPis =新的ArrayList<&的PendingIntent GT;();
           ArrayList的<&的PendingIntent GT; delPis =新的ArrayList<&的PendingIntent GT;();           INT克拉= parts.size();
           的for(int i = 0; I< CT;我++)
           {
               sentPis.add(ⅰ,piSent);
               delPis.add(ⅰ,piDel);
           }           sm.sendMultipartTextMessage(数,零,部件,sentPis,delPis);
       }
   }

我有一个问题。我的code的一部分:

 开关(的getResult code()){
   案例Activity.RESULT_OK:
   Toast.makeText(getBaseContext(),sms_sent,Toast.LENGTH_SHORT).show();
   打破;

当我发出长消息(例如lenght像四个单消息)我看到土司sms_sent四次。是否有可能看到这种敬酒只有一次成功发送整个消息后?


解决方案

以下是我用来发短信,既简单又多部分的方法。如果传递给 sendTextMessage(),着实引起 NullPointerException异常,这应该工作消息的长度:

 私人无效sendSMS(串号,字符串消息)
{
    SmsManager SM = SmsManager.getDefault();
    ArrayList的<串GT;部分= sm.divideMessage(消息);    意图iSent =新意图(发送);
    的PendingIntent piSent = PendingIntent.getBroadcast(在此,0,iSent,0);
    意图IDEL =新意图(送到);
    的PendingIntent piDel = PendingIntent.getBroadcast(在此,0,IDEL,0);    如果(parts.size()== 1)
    {
        弦乐味精= parts.get(0);
        sm.sendTextMessage(数字,空,味精,piSent,piDel);
    }
    其他
    {
        ArrayList的<&的PendingIntent GT; sentPis =新的ArrayList<&的PendingIntent GT;();
        ArrayList的<&的PendingIntent GT; delPis =新的ArrayList<&的PendingIntent GT;();        INT克拉= parts.size();
        的for(int i = 0; I< CT;我++)
        {
            sentPis.add(ⅰ,piSent);
            delPis.add(ⅰ,piDel);
        }        sm.sendMultipartTextMessage(数,零,部件,sentPis,delPis);
    }
}

I copy some code from internet to create sms application. It works well with short messages. When I want to send long message I get error:

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)

Application code:

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;
           }           
       }
   }
}

If somebody will find some time and help me I will be really grateful

Update:

I used your code and it works:) Thanks a lot:)

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);
       }
   }

I have one more question. Part of my code:

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

When I sent long message (for example lenght like four single messages) I see toast "sms_sent" four times. Is it possible to see this toast only one time after successful sending the entire message?

解决方案

The following is the method I use to send SMS, both simple and multi-part. If the length of the message passed to sendTextMessage() is, indeed, causing the NullPointerException, this should work:

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

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

    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);
    }
}

这篇关于SMS应用给我发长messege错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆