Why do I get NullPointerException when sending an SMS on an HTC Desire, or what is SubmitPdu?

只愿长相守 提交于 2019-12-18 13:28:38

问题


So I get this stack trace:

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)

And this is how I call sendTextMessage, I don't verify message length or phone number validity:

sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);

This error seems to only occur on HTC Desire or HTC Wildfire with android version 2.2 or 2.21 so I dug up the android platform source (which is actually not as easy to do as I expected) and found:
SmsMessage.java once upon a time though this might not be relevant as I see some of the line numbers don't line up.
The emergency button project is open source so you can check the code out for reference. I should probably note that I can't test this myself, I don't have either phone model.


回答1:


You might be hitting this issue with a message that is too long. I don't know why it would only be happening for certain phones, though.

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




回答2:


Replace

sms.sendDataMessage(destinationAddress, scAddress, destinationPort, data, sentIntent, deliveryIntent)

by

sms.sendMultipartTextMessage(phoneNumber, null, message, null, null);

Your message must be an ArrayList for that, use this method before calling sendSMS

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



回答3:


Not an answer but too long to post in a comment...

I think you may have multiple problems - no idea what this might mean to you but I had my desire hooked up to DDMS and gave it a try. The SMS and email were sent without problem (no errors on the stack trace) but this is what I got when using the BACK button from the Activity that shows progress (waiting for location, email sent, SMS sent etc).

01-03 02:57:11.335: ERROR/ActivityThread(14514): Activity com.emergency.button.EmergencyActivity has leaked IntentReceiver com.emergency.button.SMSSender$3@4628f068 that was originally registered here. Are you missing a call to unregisterReceiver()?
01-03 02:57:11.335: ERROR/ActivityThread(14514): android.app.IntentReceiverLeaked: Activity com.emergency.button.EmergencyActivity has leaked IntentReceiver com.emergency.button.SMSSender$3@4628f068 that was originally registered here. Are you missing a call to unregisterReceiver()?
01-03 02:57:11.335: ERROR/ActivityThread(14514):     at android.app.ActivityThread$PackageInfo$ReceiverDispatcher.<init>(ActivityThread.java:972)
01-03 02:57:11.335: ERROR/ActivityThread(14514):     at android.app.ActivityThread$PackageInfo.getReceiverDispatcher(ActivityThread.java:755)
01-03 02:57:11.335: ERROR/ActivityThread(14514):     at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:799)
01-03 02:57:11.335: ERROR/ActivityThread(14514):     at android.app.ContextImpl.registerReceiver(ContextImpl.java:786)
01-03 02:57:11.335: ERROR/ActivityThread(14514):     at android.app.ContextImpl.registerReceiver(ContextImpl.java:780)
01-03 02:57:11.335: ERROR/ActivityThread(14514):     at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:318)
01-03 02:57:11.335: ERROR/ActivityThread(14514):     at com.emergency.button.SMSSender.safeSendSMS(SMSSender.java:75)
01-03 02:57:11.335: ERROR/ActivityThread(14514):     at com.emergency.button.EmergencyActivity$EmergencyThread.sendSMS(EmergencyActivity.java:294)
01-03 02:57:11.335: ERROR/ActivityThread(14514):     at com.emergency.button.EmergencyActivity$EmergencyThread.sendMessages(EmergencyActivity.java:386)
01-03 02:57:11.335: ERROR/ActivityThread(14514):     at com.emergency.button.EmergencyActivity$EmergencyThread.run(EmergencyActivity.java:266)
01-03 02:57:11.345: ERROR/ActivityThread(14514): Activity com.emergency.button.EmergencyActivity has leaked IntentReceiver com.emergency.button.SMSSender$2@462b1e88 that was originally registered here. Are you missing a call to unregisterReceiver()?
01-03 02:57:11.345: ERROR/ActivityThread(14514): android.app.IntentReceiverLeaked: Activity com.emergency.button.EmergencyActivity has leaked IntentReceiver com.emergency.button.SMSSender$2@462b1e88 that was originally registered here. Are you missing a call to unregisterReceiver()?
01-03 02:57:11.345: ERROR/ActivityThread(14514):     at android.app.ActivityThread$PackageInfo$ReceiverDispatcher.<init>(ActivityThread.java:972)
01-03 02:57:11.345: ERROR/ActivityThread(14514):     at android.app.ActivityThread$PackageInfo.getReceiverDispatcher(ActivityThread.java:755)
01-03 02:57:11.345: ERROR/ActivityThread(14514):     at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:799)
01-03 02:57:11.345: ERROR/ActivityThread(14514):     at android.app.ContextImpl.registerReceiver(ContextImpl.java:786)
01-03 02:57:11.345: ERROR/ActivityThread(14514):     at android.app.ContextImpl.registerReceiver(ContextImpl.java:780)
01-03 02:57:11.345: ERROR/ActivityThread(14514):     at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:318)
01-03 02:57:11.345: ERROR/ActivityThread(14514):     at com.emergency.button.SMSSender.safeSendSMS(SMSSender.java:50)
01-03 02:57:11.345: ERROR/ActivityThread(14514):     at com.emergency.button.EmergencyActivity$EmergencyThread.sendSMS(EmergencyActivity.java:294)
01-03 02:57:11.345: ERROR/ActivityThread(14514):     at com.emergency.button.EmergencyActivity$EmergencyThread.sendMessages(EmergencyActivity.java:386)
01-03 02:57:11.345: ERROR/ActivityThread(14514):     at com.emergency.button.EmergencyActivity$EmergencyThread.run(EmergencyActivity.java:266)



回答4:


You have to unregister sms sent intent reciever and sms delivered intent after use, One thing you can do declare the intent Receivers as seperate class which extends BraodCast, Then you can unregister the receivers.



来源:https://stackoverflow.com/questions/4580952/why-do-i-get-nullpointerexception-when-sending-an-sms-on-an-htc-desire-or-what

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!