2011-01-02 16 views
8

Więc mam ten ślad stosu:Dlaczego otrzymuję komunikat NullPointerException podczas wysyłania wiadomości SMS w telefonie HTC Desire, lub co to jest SubmitPdu?

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) 

I to jest, jak się nazywają sendTextMessage, nie sprawdza długość wiadomość lub numer telefonu ważności:

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

Błąd ten wydaje się występować tylko na HTC Desire lub HTC Wildfire z systemem Android w wersji 2.2 lub 2.21, więc wykopałem źródło platformy Android (co w rzeczywistości nie jest tak łatwe do zrobienia, jak się spodziewałem) i znalazłem:
SmsMessage.java once upon a time chociaż może to nie być istotne, ponieważ widzę niektóre z numery linii nie są wyrównane.
Kod emergency button project to open source, dzięki czemu można sprawdzić kod w celach informacyjnych. Powinienem chyba zauważyć, że sam nie mogę tego przetestować, nie mam żadnego modelu telefonu.

+0

Czy użytkownicy twierdząc go ulega awarii (wymusić zamknięcie lub coś podobnego)? Próbowałem aplikacji z mojego Desire i działało bez problemu - wysłano zarówno wiadomości e-mail, jak i sms. PDU oznacza skrót Protocol Data Unit. – Squonk

+0

Rynek Android zgłasza awarie i mam zintegrowany rejestrator śledzenia stosu. Więc tak, to się załamuje. Dzięki za informacje i testy, zastanawiam się, co dokładnie się dzieje. – ubershmekel

+0

zobacz moją odpowiedź/odpowiedź – Squonk

Odpowiedz

17

Być może trafiasz w ten problem z komunikatem, który jest zbyt długi. Nie wiem, dlaczego tak się dzieje tylko w przypadku niektórych telefonów.

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

+6

Wierzę, że to był problem. Po przełączeniu z sendTextMessage na sendMultipartTextMessage wyjątek nigdy nie powrócił. Google naprawdę musi tam podać bardziej opisowy wyjątek. – ubershmekel

0

nie odpowiedź, ale zbyt długo, aby umieścić w komentarzu ...

myślę, że może mieć wiele problemów - nie ma pojęcia, co to może oznaczać dla ciebie, ale miałem chęć podłączyć do DDMS i dał próba. Wiadomość SMS i wiadomość e-mail zostały wysłane bez problemu (brak błędów w zapisie stosu), ale to właśnie dostałem, gdy użyłem przycisku WSTECZ z Aktywności, która pokazuje postęp (oczekiwanie na lokalizację, wysłanie e-maila, wysłanie SMS itp.).

01-03 02:57:11.335: ERROR/ActivityThread(14514): Activity com.emergency.button.EmergencyActivity has leaked IntentReceiver [email protected] 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 [email protected] 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 [email protected] 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 [email protected] 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) 
+0

Myślę, że to ma sens, że muszę wyrejestrować odbiorniki po tym, jak skończę z nimi. To będzie dziwne, ponieważ będą musieli się wyrejestrować. http://code.google.com/p/emergencybutton/source/browse/trunk/src/com/emergency/button/SMSSender.java?r=24 – ubershmekel

0

Musisz wyrejestrować SMS wysłaną zamiaru odbiornik i SMS dostarczanych intencję Po użyciu jedno można zrobić zadeklarować zamiarem Odbiorniki jak oddzielne klasy, która rozciąga BraodCast, Następnie można wyrejestrować odbiorniki.

+0

Czy sądzisz, że to właśnie spowodowało wyjątek java.lang.NullPointerException w getSubmitPdu ? – ubershmekel

+0

Zobacz odpowiedź JohnWaynera, przywołany problem bardzo dobrze podsumowuje tę sytuację. – Kingsolmn

7

Wymień

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

przez

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

Twoja wiadomość musi być ArrayList za to skorzystać z tej metody przed wywołaniem sendSMS

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

to jest odpowiedź i jest na Desire S. – Mark

Powiązane problemy