Autore Topic: Intent diverso da quello chiamato  (Letto 650 volte)

Offline teo_

  • Utente junior
  • **
  • Post: 72
  • Respect: +1
    • Github
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Sistema operativo:
    Windows 7 - Ubuntu 12.10
Intent diverso da quello chiamato
« il: 07 Ottobre 2011, 00:02:31 CEST »
0
come da titolo, vi espongo il mio problema:

con l'aiuto di un broadcast receiver che si mette in ascolto di certi eventi, lancio una notifica nella status bar, allegando un intent da chiamare.
le informazioni inserite nella status bar sono le stesse che inserisco all'interno dell'intent con la funzione putextra(...)
il problema che ho riscontrato però è il seguente, nella barra delle notifiche le informazioni visualizzate sono corrette, ma quando clicco sulla notifica, l'intent viene aperto con le informazioni sbagliate (per capirci se arriva un messaggio e mostro nella status bar il nome del mandante di quest'ultimo, il nome viene inserito corretto, ma non appena clicco sulla notifica mi apre la conversazione di un altro utente)
per precisazione nel mio caso la conversazione viene a formarsi grazie alle informazioni ricavate dall'intent..(nome, id ecc..)

il codice nel quale mando la notifica nella status bar è il seguente:

Codice (Java): [Seleziona]
private void notificaMessaggioRicevuto(MyMessage message) {
                if (message.getMessageType() == MyMessage.SMS_TYPE
                                && message.getMessageClass() == MessageClass.CLASS_0) {
                        return;// se l'sms è di classe 0, il sistema provvederà a
                                        // maneggiarlo (sms flash)
                }

                // prendo le preferenze dell'utente
                SharedPreferences prefs = PreferenceManager
                                .getDefaultSharedPreferences(context);

                notificheAttive = prefs.getBoolean(Preferences.NOTIFICHE_PREF,
                                Preferences.ATTIVA_NOTIFICHE);

                if (notificheAttive) {
                        String numero=message.getAddress();
                        String nome=message.getName();
                        String testoMex=message.getBody();
                        String idContatto=message.getContactId();
                        long when = System.currentTimeMillis();
                       
                        String ns = Context.NOTIFICATION_SERVICE;
                        NotificationManager mNotificationManager = (NotificationManager) context
                                        .getSystemService(ns);

                        int icon = R.drawable.icon;//icona notifica
                        CharSequence tickerText = nome + ": " + testoMex;
                        Notification notification = new Notification(icon, tickerText, when);

                        CharSequence contentTitle = nome;
                        CharSequence contentText = testoMex;
                        Intent notificationIntent = new Intent(context,
                                        SMSConversation.class);
                        String pkg = context.getPackageName();

                        notificationIntent.putExtra(pkg + ".myContact",
                                        numero);
                        if (nome != null) {
                                notificationIntent.putExtra(pkg + ".myContactName",
                                                nome);
                        } else {
                                notificationIntent.putExtra(pkg + ".myContactName",
                                                numero);
                        }
                               

                        notificationIntent.putExtra(pkg + ".myContactId",
                                        idContatto);

                        PendingIntent contentIntent = PendingIntent.getActivity(context, 0,
                                        notificationIntent, 0);
                        notification.setLatestEventInfo(context.getApplicationContext(),
                                        contentTitle, contentText, contentIntent);

                        notification.defaults |= Notification.DEFAULT_SOUND;    //Suona
                        notification.defaults |= Notification.DEFAULT_LIGHTS;   //LED
                        notification.defaults |= Notification.DEFAULT_VIBRATE;  //Vibra
                       
                        mNotificationManager.notify(NOTIFICATION_ID, notification);
                        if(SmsAppActivity.online){
                                Log.v("----------------------------------vvvvvvvvv-----------------------------------");
                                SmsAppActivity.update();
                        }
                }

        }

avete qualche idea sul perchè di questo comportamento? qualche consiglio??
spero di essere stato sufficientemente chiaro nell'esposizione del problema.. grazie in anticipo delle eventuali dritte ;)

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Intent diverso da quello chiamato
« Risposta #1 il: 07 Ottobre 2011, 00:13:35 CEST »
0
Secondo me l'errore potrebbe essere nella classe SMSconversation nel punto di analisi dei contenuti dell'intent. Potresti postarci un po' di codice? Tra l'altro, ti serve proprio il package name? Non sarebbe più comodo usare delle costanti tipo "NOME_UTENTE" "MESSAGGIO" ecc?  ;-)

Offline teo_

  • Utente junior
  • **
  • Post: 72
  • Respect: +1
    • Github
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Sistema operativo:
    Windows 7 - Ubuntu 12.10
Re:Intent diverso da quello chiamato
« Risposta #2 il: 07 Ottobre 2011, 16:41:06 CEST »
0
Secondo me l'errore potrebbe essere nella classe SMSconversation nel punto di analisi dei contenuti dell'intent. Potresti postarci un po' di codice? Tra l'altro, ti serve proprio il package name? Non sarebbe più comodo usare delle costanti tipo "NOME_UTENTE" "MESSAGGIO" ecc?  ;-)
adesso che mi ci fai pensare in effetti hai ragione, negli esempi avevo sempre trovato così e senza pensarci troppo su avevo fatto così anch'io :)
comunque non credo possano esserci errori nella classe smsconversation, anche perchè quando sbaglia a caricare l'intent non esegue nemmeno certe operazioni che dovrebbe fare (per esempio selezionare l'ultimo mex disponibile, in modo da vedere quello e non dover scorrere tutta la lista dei messaggi per trovare l'ultimo), comunque sia, ti posto le parti più importanti di SMSconversation, magari sono io che non vedo errori :)

Codice (Java): [Seleziona]
@Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.conversazione);
               
                //prendo le preferenze
                SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
       
        attivaCriptInviati = prefs.getBoolean(Preferences.ATTIVA_CRIPT_INVIATI, Preferences.CRIPT_INVIATI);
        attivaDecriptInviati = prefs.getBoolean(Preferences.ATTIVA_DECRIPT_INVIATI_AUTO, Preferences.DECRIPT_INVIATI);
                key=prefs.getString(Preferences.CHIAVE_CRIPT, Preferences.DEFAULT_CHIAVE_CRIPT);
                attivaContatoreLP=prefs.getBoolean(Preferences.ATTIVA_CONTATORE_LP, Preferences.DEFAULT_CONTATORE_LP);
               
                ... inizializzazioni view ...
               
                if(!attivaContatoreLP){
                        nCaratteri.setVisibility(INVISIBLE);
                }
               
                registerForContextMenu(messaggi);
               
                messaggi.setDivider(null);
               
                Intent i=getIntent();
                String pkg=getPackageName();
               
                contatto=i.getStringExtra(pkg+".myContact");
               
                contatto=MySmsAppUtils.removePrefix(contatto);
                nomeContatto=i.getStringExtra(pkg+".myContactName");
                idContact=i.getStringExtra(pkg+".myContactId");
               
                addressText.setText(nomeContatto);

                this.setTitle("Messaggi di: "+nomeContatto);
                mContext=this;
               
                readSMS();
               
                //setPhoto();
                if(idContact!=null){
                        Bitmap img=getBitmapByContactId(this, idContact);
                        if(img!=null){
                                contPhoto.setImageBitmap(img);
                        } else {
                                contPhoto.setImageResource(R.drawable.iconunknown);//android.R.drawable.ic_dialog_email
                        }
                       
                } else {
                        contPhoto.setImageResource(R.drawable.iconunknown);
                }
               
                contPhoto.assignContactFromPhone(contatto, true);
                contPhoto.setMode(ContactsContract.QuickContact.MODE_LARGE);
               
                btnSendSMS.setOnClickListener(new View.OnClickListener() {
                       
                        public void onClick(View v) {
                                String phoneNo=contatto;
                                String message=txtMessage.getText().toString();
                                if(phoneNo.length()>0 && message.length()>0)
                                {
                                        if(attivaCriptInviati){
                                                Cript cripter=new Cript(message, key);
                                                cripter.cripta();
                                                message=cripter.getText();
                                                com.dev.SMSMessaging.Log.v(message + " <- if(attivaCriptInviati)");
                                        }
                                        sendSMS(phoneNo, message);
                                       
                                        txtMessage.setText("");
                                        nPages = 1;
                                }
                                else Toast.makeText(getBaseContext(), "Inserisci un testo per il messaggio.", Toast.LENGTH_SHORT).show();
                                       
                        }//onClick invioSMS
                });
               
                txtMessage.addTextChangedListener(new TextWatcher() {
                        ...
                });
               
                IntentFilter filterReceived = new IntentFilter();
                filterReceived.addAction("android.provider.Telephony.SMS_RECEIVED");
               
                smsReceived = new BroadcastReceiver() {
                       
                        @Override
                        public void onReceive(Context context, Intent intent) {
                                //---get the SMS message passed in---
                                Bundle bundle=intent.getExtras();
                                SmsMessage[] msgs=null;
                                if(bundle!= null)
                                {
                                        //richiama l'sms ricevuto
                                        Object[] pdus=(Object[])bundle.get("pdus");
                                        msgs=new SmsMessage[pdus.length];
                                       
                                        String address="";
                                        String message="";
                                        int type=SmsMessagesSender.MESSAGE_TYPE_INBOX;
                                        long date=0;
                                       
                                        for(int h=0;h<msgs.length;h++)
                                        {
                                                msgs[h]=SmsMessage.createFromPdu((byte[])pdus[h]);
                                                address = msgs[h].getOriginatingAddress();
                                                message = msgs[h].getMessageBody().toString();
                                                date = msgs[h].getTimestampMillis();
                                        }
                                        if(MySmsAppUtils.removePrefix(address).equals(contatto)) {
                                                Messaggio nuovo = new Messaggio(message, date, false);
                                                nuovo.setIndirizzo(address);
                                                nuovo.setType(type);
                                                updateSMS(nuovo);
                                                // selezionaUltimoMex();
                                               
                                               
                                                Log.v(SmsMessagesSender.setAsRead(mContext, MySmsAppUtils.getUriLastMessageReceived(mContext,message, address), true)+"");
                                               
                                        }
                                       
                                }//if(bundle!= null)
                        }//onReceive(Context context, Intent intent)
                };
               
                registerReceiver(smsReceived, filterReceived);
               
        }//onCreate(Bundle savedInstanceState)

readSMS è una semplice funzione che interroga il db degli sms tramite l'uri.parse("content://sms"); e ricava i messaggi riguardanti una sola persona :)
mentre remove prefix non fa altro che restituire un numero senza prefisso internazionale (es: il numero +393405674775 lo trasforma in 3405674775)

spero tu possa capirci qualcosa di più ora..
ah! e grazie per avermi risposto così velocemente, ieri sera purtroppo non potevo rispondere, appena ho avuto tempo l'ho fatto :)

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Intent diverso da quello chiamato
« Risposta #3 il: 07 Ottobre 2011, 19:36:47 CEST »
0
Quella che immagino sia una TextView di nome addressText e il dialog riportano il nome corretto? Se sì, allora mi sa che l'errore è nel readSms().  :-P

Offline teo_

  • Utente junior
  • **
  • Post: 72
  • Respect: +1
    • Github
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Sistema operativo:
    Windows 7 - Ubuntu 12.10
Re:Intent diverso da quello chiamato
« Risposta #4 il: 07 Ottobre 2011, 20:07:40 CEST »
0
Quella che immagino sia una TextView di nome addressText e il dialog riportano il nome corretto? Se sì, allora mi sa che l'errore è nel readSms().  :-P
hai immaginato giusto :) è una TextView, ma no, non riporta il nome giusto, riporta il nome della persona dei messaggi, che non è quella chiamata dall'intent :) è per questo che non capisco...

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Intent diverso da quello chiamato
« Risposta #5 il: 07 Ottobre 2011, 20:27:59 CEST »
+1
L'unica cosa strana che vedo è questa:
Codice (Java): [Seleziona]
PendingIntent contentIntent = PendingIntent.getActivity(context, 0,
                                        notificationIntent, 0); //Usi il valore 0 (ultimo paramentro)  che non corrisponde a nessuna delle costanti per il flag del PendingIntent.
Prova a sostituire lo zero con un PendingIntent.FLAG_CANCEL_CURRENT.  E' una cosa che va fatta, perché lo zero non è tra le costanti, però non so se risolverà il problema.
Comunque tutto il resto mi sembra giusto.  :-)

Offline teo_

  • Utente junior
  • **
  • Post: 72
  • Respect: +1
    • Github
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Sistema operativo:
    Windows 7 - Ubuntu 12.10
Re:Intent diverso da quello chiamato
« Risposta #6 il: 07 Ottobre 2011, 20:39:56 CEST »
0
L'unica cosa strana che vedo è questa:
Codice (Java): [Seleziona]
PendingIntent contentIntent = PendingIntent.getActivity(context, 0,
                                        notificationIntent, 0); //Usi il valore 0 (ultimo paramentro)  che non corrisponde a nessuna delle costanti per il flag del PendingIntent.
Prova a sostituire lo zero con un PendingIntent.FLAG_CANCEL_CURRENT.  E' una cosa che va fatta, perché lo zero non è tra le costanti, però non so se risolverà il problema.
Comunque tutto il resto mi sembra giusto.  :-)
ora provo e ti so dire, grazie mille comunque :)


Offline teo_

  • Utente junior
  • **
  • Post: 72
  • Respect: +1
    • Github
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Sistema operativo:
    Windows 7 - Ubuntu 12.10
Re:Intent diverso da quello chiamato
« Risposta #7 il: 09 Ottobre 2011, 22:03:26 CEST »
0
ora provo e ti so dire, grazie mille comunque :)

dopo 2 giorni di prova ecco il risultato, FUNZIONA!!!! grazie mille della dritta ;)
c'è solo un problema, certe volte mi apre la conversazione senza però mettermi il focus sull'ultimo messaggio ricevuto, in pratica mi mostra la cima della listview di messaggi, mentre dovrebbe mostrarmi l'ultimo...