Autore Topic: Lettura messaggi ricevuti: ogni tanto da errore sul cursor  (Letto 664 volte)

Offline Noisemaker

  • Utente junior
  • **
  • Post: 54
  • Respect: +1
    • Mostra profilo
Lettura messaggi ricevuti: ogni tanto da errore sul cursor
« il: 02 Giugno 2012, 19:44:39 CEST »
0
Ciao a tutti,
avrei bisogno di un aiuto per leggere i messaggi ricevuti. Attualmente sto usando il seguente codice:
Codice: [Seleziona]
// Build the query to get all messages
                Uri mSmsQueryUri = Uri.parse("content://sms/inbox");
                String columns[] = new String[] {"person", "address", "body", "date","status"};
                String sortOrder = "date ASC";
               
                // Run query and check the result
                try {
                    cursor = mContentResolver.query(mSmsQueryUri, null, null, null, sortOrder);
                    Log.i(LOG, LOG_PREFIX + "# elementi di cursor: " + cursor.getCount() );
                   
                    cursor.moveToFirst();
                    while( cursor != null && cursor.isAfterLast() == false )
                    {
                        ...CODE...
                       
                        cursor.moveToNext();
                    }
                   
                } catch (Exception e) {
                        e.printStackTrace();
                        Log.i(LOG, LOG_PREFIX + "Exception:" + e.getMessage());
                } finally {
                    cursor.close();
Il tutto funziona, però ogni tanto quando faccio il refresh per recuperare i nuovi messaggi non li recupera tutti e mi da errore su
Codice: [Seleziona]
06-02 19:36:41.473: E/MemoryHeapBase(13933): mmap(fd=493, size=4194304) failed (Out of memory)
06-02 19:36:41.473: E/CursorWindow(13933): CursorWindow heap allocation failed
06-02 19:36:41.473: W/System.err(13933): java.lang.IllegalStateException: Couldn't init cursor window
06-02 19:36:41.473: W/System.err(13933):         at android.database.CursorWindow.native_init(Native Method)
06-02 19:36:41.473: W/System.err(13933):         at android.database.CursorWindow.<init>(CursorWindow.java:41)
06-02 19:36:41.473: W/System.err(13933):         at android.content.ContentProviderProxy.query(ContentProviderNative.java:364)
06-02 19:36:41.473: W/System.err(13933):         at android.content.ContentResolver.query(ContentResolver.java:262)
06-02 19:36:41.473: W/System.err(13933):         at it.develop.mypackage.MessageItem.generateContactNameFromPhoneNumber(MessageItem.java:197)
06-02 19:36:41.473: W/System.err(13933):         at it.develop.mypackage.MessagesListAcitivity$MyThread.getAllConversations(MessagesListAcitivity.java:608)
06-02 19:36:41.473: W/System.err(13933):         at it.develop.mypackage.MessagesListAcitivity$MyThread.doInBackground(MessagesListAcitivity.java:449)
06-02 19:36:41.473: W/System.err(13933):         at it.develop.mypackage.MessagesListAcitivity$MyThread.doInBackground(MessagesListAcitivity.java:1)
06-02 19:36:41.473: W/System.err(13933):         at android.os.AsyncTask$2.call(AsyncTask.java:185)
06-02 19:36:41.473: W/System.err(13933):         at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
06-02 19:36:41.473: W/System.err(13933):         at java.util.concurrent.FutureTask.run(FutureTask.java:138)
06-02 19:36:41.473: W/System.err(13933):         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
06-02 19:36:41.473: W/System.err(13933):         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
06-02 19:36:41.473: W/System.err(13933):         at java.lang.Thread.run(Thread.java:1019)
Non riesco a capire a cosa sia dovuto, qualcuno riesce ad aiutarmi?

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3460
  • Respect: +503
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Lettura messaggi ricevuti: ogni tanto da errore sul cursor
« Risposta #1 il: 02 Giugno 2012, 21:34:00 CEST »
0
In realtà l'errore sembrerebbe provenire da:

Codice: [Seleziona]
06-02 19:36:41.473: W/System.err(13933):         at it.develop.mypackage.MessageItem.generateContactNameFromPhoneNumber(MessageItem.java:197)

Se stai cercando di tirare fuori il nome dal numero assicurati di utilizzare questa classe:

ContactsContract.PhoneLookup | Android Developers

(e magari applica qualche ottimizzazione tu stesso in modo da minimizzare il numero di query)

Offline Noisemaker

  • Utente junior
  • **
  • Post: 54
  • Respect: +1
    • Mostra profilo
Re:Lettura messaggi ricevuti: ogni tanto da errore sul cursor
« Risposta #2 il: 03 Giugno 2012, 11:32:58 CEST »
0
Dunque, mi sembra di aver usato la classe che dici tu per fare la richiesta. Avevo seguito il tutorial che mi hai linkato infatti :)
Questa è la funzione (non prende parametri perchè è interna alla classe e sa già dove prendere il numero ;) )
Codice: [Seleziona]
public String generateContactNameFromPhoneNumber()
    {
            //--------------- Get contact name from phone number ----------------
            String contactName;
            // encode the phone number and build the filter URI
            Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode( this.senderPhoneNumber ));
            // define the columns I want the query to return
            String[] projection = new String[] { ContactsContract.PhoneLookup.DISPLAY_NAME };
           
                    Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null);

                if (cursor.moveToFirst()) {
                    // Get values from contacts database:
                    contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME));
               
                } else {
                    contactName = senderPhoneNumber; // Contact unknow, name is the phone number               
                }
                return contactName;
    }

EDIT:
Credo che il problema dipendesse dal fatto che non avevo chiuso il cursor dentro la funzione che recupera il nome dal numero...possibile giusto? ;)

Ora faccio un paio di test ma sembra funzionare...già che ci sono vi chiedo un paio di cose sull'ottimizzazione. All'avvio della app ci mette un paio di secondi a caricare tutti i messaggi, ho notato che anche la app di default ci mette circa un tempo simile (mi sembra anche plausibile se ci sono parecchi messaggi), volevo tuttavia sapere se secondo voi c'è un modo di ottimizzare il tutto.
In particolare:
1) All'apertura della app leggo tutti i msg, dopodichè per ognuno creo un oggetto msgItem inserendo numero, nome contatto, ora, ecc...
2) Cerco se nella mia lista di conversazioni se ce n'è una con un numero uguale e nel caso inserisco il messaggio (mantenendo ordinati i msg per data dentro l'oggetto Conversation). Se invece non c'è creo una nuova Conversation e aggiungo il messaggio.
3) Infine se nella lista di Conversation la conversazione c'era già, la elimino e la inserisco nuovamente (per mantenere oridnate le conversazioni per data senza dover fare spostamenti nell'arraylist), altrimenti la inserisco e basta

Struttura dati:
1) MessageItem --> oggetto che rappresenta un messaggio e che ha numero di tel, nome, data, ecc....
2) Conversation --> oggetto che rappresenta una conversazione. Ha una arraylist di MessageItem, un campo con il numero con cui quella conversazione sta avvenendo e un campo con la data dell'ultimo messaggio (queste ultime cose per snellire la ricerca quando inserisco una Conversation
3) Una arrayList di Conversation

Ora dovrò affrontare anche il problema che quando clicco su una conversazione devo aprirla, e qui non so come fare, ovvero dovendo aprire un'altra activity, le rifaccio leggere tutto il DB con solo il numero che mi interessa?? Perchè passargli i dati che ho non credo sia possibile giusto?
(chiedo scusa se siamo un attimo usciti dal problema descritto all'inizio ma già che l'argomento è la lettura di messaggi ne ho approfittato. Se non si può apro un altro thread ;) )
« Ultima modifica: 03 Giugno 2012, 12:06:15 CEST da Noisemaker »

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3460
  • Respect: +503
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Lettura messaggi ricevuti: ogni tanto da errore sul cursor
« Risposta #3 il: 03 Giugno 2012, 12:34:07 CEST »
0
Puoi dare un occhio a come funziona l'app originale dei messaggi:

https://github.com/android/platform_packages_apps_mms

Offline Noisemaker

  • Utente junior
  • **
  • Post: 54
  • Respect: +1
    • Mostra profilo
Re:Lettura messaggi ricevuti: ogni tanto da errore sul cursor
« Risposta #4 il: 03 Giugno 2012, 19:59:33 CEST »
0
...ammetto di capirci poco nella logica che hanno usato xD xD