为什么在HTC Desire上发送短信时会出现NullPointerException,或者什么是SubmitPdu?

ube*_*kel 8 sms android

所以我得到了这个堆栈跟踪:

java.lang.NullPointerException    
   at android.telephony.SmsMessage$SubmitPdu.<init>(SmsMessage.java:132)
   at android.telephony.SmsMessage.getSubmitPdu(SmsMessage.java:551)
   at android.telephony.SmsManager.sendTextMessage(SmsManager.java:228)
   at android.telephony.SmsManager.sendTextMessage(SmsManager.java:107)
   at com.emergency.button.SMSSender.safeSendSMS(SMSSender.java:91)
   at com.emergency.button.EmergencyActivity$EmergencyThread
       .sendSMS(EmergencyActivity.java:294)
   at com.emergency.button.EmergencyActivity$EmergencyThread
       .sendMessages(EmergencyActivity.java:386)
   at com.emergency.button.EmergencyActivity$EmergencyThread
       .run(EmergencyActivity.java:266)
Run Code Online (Sandbox Code Playgroud)

这就是我调用sendTextMessage的方式,我不验证消息长度或电话号码的有效性:

sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);
Run Code Online (Sandbox Code Playgroud)

这个错误似乎只发生在HTC Desire或HTC Wildfire与Android 2.2或2.21上,所以我挖出了android平台源码(这实际上并不像我预期的那么容易)并且发现:
SmsMessage.java曾经一度虽然这可能不相关,因为我看到一些行号没有对齐.
紧急按钮项目是开源的,所以你可以检查出来的代码以供参考.我应该注意到我自己无法测试,我没有手机型号.

小智 17

您可能会使用太长的消息来解决此问题.我不知道为什么它只会发生在某些手机上.

http://code.google.com/p/android/issues/detail?id=3718

  • 我相信这就是问题所在.从sendTextMessage切换到sendMultipartTextMessage之后,异常永远不会回来.谷歌真的需要在那里抛出一个更具描述性的例外. (6认同)

Ana*_*ass 7

更换

sms.sendDataMessage(destinationAddress, scAddress, destinationPort, data, sentIntent, deliveryIntent)
Run Code Online (Sandbox Code Playgroud)

通过

sms.sendMultipartTextMessage(phoneNumber, null, message, null, null);
Run Code Online (Sandbox Code Playgroud)

您的消息必须是ArrayList,在调用sendSMS之前使用此方法

SmsManager sms = SmsManager.getDefault();
ArrayList<String> parts = sms.divideMessage(locationMessage);
sendSMS(telNumber.getText().toString(),parts );
Run Code Online (Sandbox Code Playgroud)