2011-01-02 15 views
8

così ottengo questo stack trace:Perché ottengo NullPointerException quando si invia un SMS su un HTC Desire o cos'è 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) 

Ed è così che io chiamo sendTextMessage, non verifico lunghezza dei messaggi o il numero di telefono di validità:

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

Questo errore sembra verificarsi solo su HTC Desire o HTC Wildfire con Android versione 2.2 o 2.21 così ho scavato la sorgente della piattaforma Android (che in realtà non è facile da fare come mi aspettavo) e ho trovato:
SmsMessage.java once upon a time anche se questo potrebbe non essere rilevante in quanto vedo alcuni dei i numeri di riga non si allineano.
Il emergency button project è open source quindi è possibile controllare il codice per riferimento. Probabilmente dovrei notare che non posso testarlo da solo, non ho né il modello del telefono.

+0

Sono utenti sostenendo che sta andando in crash (forza chiusa o qualcosa di simile)? Ho provato l'app dal mio desiderio e ha funzionato senza problemi - sia messaggi di posta elettronica che di sms inviati con successo. A proposito, la PDU è l'acronimo di Protocol Data Unit. – Squonk

+0

Il mercato Android riporta arresti anomali e ho anche integrato uno stack logger integrato. Quindi sì, si sta bloccando. Grazie per le informazioni e i test, mi chiedo che cosa stia succedendo esattamente. – ubershmekel

+0

vedere la mia risposta/risposta – Squonk

risposta

17

È possibile che si stia verificando questo problema con un messaggio troppo lungo. Non so perché sarebbe successo solo per alcuni telefoni, però.

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

+6

Credo che questo fosse il problema. Dopo il passaggio da sendTextMessage a sendMultipartTextMessage, l'eccezione non è mai tornata. Google ha davvero bisogno di lanciare un'eccezione più descrittiva lì. – ubershmekel

0

Non una risposta, ma troppo lungo per inserire in un commento ...

penso che è possibile avere più problemi - idea di cosa questo potrebbe significare per voi, ma ho avuto il mio desiderio collegato a DDMS e ha dato un tentativo. Gli SMS e le e-mail sono stati inviati senza problemi (nessun errore nella traccia dello stack) ma questo è quello che ho ottenuto usando il pulsante INDIETRO dell'attività che mostra lo stato di avanzamento (in attesa di posizione, e-mail inviate, SMS inviati ecc.).

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

Credo che abbia senso che ho bisogno di annullare la registrazione dei ricevitori dopo che ho finito con loro. Sarà strano però perché dovranno registrarsi. http://code.google.com/p/emergencybutton/source/browse/trunk/src/com/emergency/button/SMSSender.java?r=24 – ubershmekel

0

si deve annullare la registrazione di sms inviati ricevitore intento e sms consegnati intento dopo l'uso, Una cosa che si può fare dichiarare le Ricevitori intenti come classe separata che si estende braodcast, Quindi è possibile annullare la registrazione dei ricevitori.

+0

Pensi che sia ciò che ha causato java.lang.NullPointerException in getSubmitPdu ? – ubershmekel

+0

Vedere la risposta di JohnWayner, il problema di riferimento lo riassume molto bene. – Kingsolmn

7

Sostituire

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

da

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

vostro messaggio deve essere un ArrayList per questo, utilizzare questo metodo prima di chiamare SendSMS

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

questa è la risposta, ed è sul desiderio S – Mark

Problemi correlati