Autore Topic: ricezione sms: pdu  (Letto 858 volte)

Offline lo

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus one
ricezione sms: pdu
« il: 05 Novembre 2010, 11:11:34 CET »
0
ciao a tutti.
non sono sicuro che questa sia la sezione giusta ma non ne ho trovata una dedicata... (edit: appunto ;) )

avrei una domanda sulla ricezione degli sms,
dunque:

broadcast receiver filtrato su android.provider.Telephony.SMS_RECEIVED:

Codice (Java): [Seleziona]
public void onReceive(Context context, Intent intent) {
        Bundle bundle = intent.getExtras();

        Object pdus[] = (Object[]) bundle.get("pdus");

        SmsMessage smsMessage[] = new SmsMessage[pdus.length];

        for (int n = 0; n < pdus.length; n++) {
                byte[] pdu = (byte[]) pdus[n];

                if (pdu != null) {
                        smsMessage[n] = SmsMessage.createFromPdu(pdu);

                        // some more code...
                }
        }
}

come mai (credo solo in caso di messaggi superiori a 160 caratteri e quindi splittati) mi capita di ricevere un pdu null?
sono costretto a fare il controllo esplicitamente, altrimenti viene sollevata un'eccezione.

lo domando perché in giro ho trovato solo codice che si preoccupa del valore del bundle e non del pdu... o_O

grazie mille! :)
« Ultima modifica: 05 Novembre 2010, 11:14:03 CET da lo »

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +507
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:ricezione sms: pdu
« Risposta #1 il: 05 Novembre 2010, 11:15:31 CET »
0
Strano io uso il tuo medesimo codice ma non ho mai avuto problemi.
Prova a incollare l'eccezione che ottieni...

Offline lo

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus one
Re:ricezione sms: pdu
« Risposta #2 il: 05 Novembre 2010, 14:24:58 CET »
0
eccola:

Codice (Java): [Seleziona]
ERROR/AndroidRuntime(16359): FATAL EXCEPTION: main
ERROR/AndroidRuntime(16359): java.lang.RuntimeException: Unable to start receiver <my_package>.SmsReceiver: java.lang.NullPointerException
ERROR/AndroidRuntime(16359):     at android.app.ActivityThread.handleReceiver(ActivityThread.java:2821)
ERROR/AndroidRuntime(16359):     at android.app.ActivityThread.access$3200(ActivityThread.java:125)
ERROR/AndroidRuntime(16359):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2083)
ERROR/AndroidRuntime(16359):     at android.os.Handler.dispatchMessage(Handler.java:99)
ERROR/AndroidRuntime(16359):     at android.os.Looper.loop(Looper.java:123)
ERROR/AndroidRuntime(16359):     at android.app.ActivityThread.main(ActivityThread.java:4627)
ERROR/AndroidRuntime(16359):     at java.lang.reflect.Method.invokeNative(Native Method)
ERROR/AndroidRuntime(16359):     at java.lang.reflect.Method.invoke(Method.java:521)
ERROR/AndroidRuntime(16359):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
ERROR/AndroidRuntime(16359):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
ERROR/AndroidRuntime(16359):     at dalvik.system.NativeStart.main(Native Method)
ERROR/AndroidRuntime(16359): Caused by: java.lang.NullPointerException
ERROR/AndroidRuntime(16359):     at android.telephony.SmsMessage.getDisplayOriginatingAddress(SmsMessage.java:474)
ERROR/AndroidRuntime(16359):     at <my_package>.SmsParser.handleSmsMessage(SmsParser.java:75)
ERROR/AndroidRuntime(16359):     at <my_package>.SmsReceiver.handleIntent(SmsReceiver.java:87)
ERROR/AndroidRuntime(16359):     at <my_package>.SmsReceiver.onReceive(SmsReceiver.java:51)
ERROR/AndroidRuntime(16359):     at android.app.ActivityThread.handleReceiver(ActivityThread.java:2810)
ERROR/AndroidRuntime(16359):     ... 10 more
ERROR/AndroidRuntime(16367): FATAL EXCEPTION: SmsReceiverService
ERROR/AndroidRuntime(16367): java.lang.NullPointerException
ERROR/AndroidRuntime(16367):     at android.telephony.SmsMessage.getMessageClass(SmsMessage.java:489)
ERROR/AndroidRuntime(16367):     at com.android.mms.transaction.SmsReceiverService.insertMessage(SmsReceiverService.java:357)
ERROR/AndroidRuntime(16367):     at com.android.mms.transaction.SmsReceiverService.handleSmsReceived(SmsReceiverService.java:300)
ERROR/AndroidRuntime(16367):     at com.android.mms.transaction.SmsReceiverService.access$100(SmsReceiverService.java:67)
ERROR/AndroidRuntime(16367):     at com.android.mms.transaction.SmsReceiverService$ServiceHandler.handleMessage(SmsReceiverService.java:172)
ERROR/AndroidRuntime(16367):     at android.os.Handler.dispatchMessage(Handler.java:99)
ERROR/AndroidRuntime(16367):     at android.os.Looper.loop(Looper.java:123)
ERROR/AndroidRuntime(16367):     at android.os.HandlerThread.run(HandlerThread.java:60)

di seguito parte delle mie classi per risalire alle righe di codice.
ho commentato il controllo sul pdu per far uscire l'eccezione, anche se la seconda, "FATAL EXCEPTION: SmsReceiverService", viene sollevata comunque...

SmsReceiver:

Codice (Java): [Seleziona]
@Override
public void onReceive(Context context, Intent intent) {
        this.context = context;

        handleIntent(intent); // row 51
}

private void handleIntent(Intent intent) {
        Bundle bundle = intent.getExtras();
        Object pdus[] = (Object[]) bundle.get("pdus");

        for (int n = 0; n < pdus.length; n++) {
                Utils.log("SmsReceiver | handleIntent | pdus[n] | " + pdus[n], LogLevel.INFO);
        }

        SmsMessage smsMessage[] = new SmsMessage[pdus.length];
        for (int n = 0; n < pdus.length; n++) {
                byte[] pdu = (byte[]) pdus[n];

                //if (pdu != null) {
                        smsMessage[n] = SmsMessage.createFromPdu(pdu);

                        SmsParser smsParser = new SmsParser(context, this);
                        smsParser.handleSmsMessage(smsMessage[n]); // row 87
                //}
        }
}

SmsParser:

Codice (Java): [Seleziona]
protected void handleSmsMessage(SmsMessage smsMessage) {
        String abbonamentoNumber = context.getString(R.integer.abbonamentoNumber);
        String smsOriginatingAddress = smsMessage.getDisplayOriginatingAddress(); // row 75

        if (smsOriginatingAddress.equals(abbonamentoNumber)) {
                String smsText = smsMessage.getDisplayMessageBody();

                parseSmsText(smsText);
        }
}

grazie :)
« Ultima modifica: 05 Novembre 2010, 14:27:37 CET da lo »

Offline lo

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus one
Re:ricezione sms: pdu
« Risposta #3 il: 11 Novembre 2010, 23:18:06 CET »
0
...suggerimentino? :-P