SMS应用给我发长messege错误 [英] sms application gives an error when I send long 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 theNullPointerException
, 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屋!