Autore Topic: Problema lettura contatti  (Letto 3047 volte)

Offline Gambanera

  • Nuovo arrivato
  • *
  • Post: 27
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    Vodafone ideos
  • Play Store ID:
    Gambanera
  • Sistema operativo:
    Ubuntu 10.10 / Windows 7
Problema lettura contatti
« il: 09 Febbraio 2011, 14:26:34 CET »
0
Buon giorno a tutti, vorrei leggere i contatti presenti nella rubrica, precisamente nome visualizzato e numero, è dopo una rapida ricerca ho trovato questo: http://stackoverflow.com/questions/1721279/how-to-read-contacts-on-android-2-0

Ho implementato il codice, come da esempio, ma la lettura del numero fa terminare l'applicazione mentre per quanto riguarda il nome tutto fila liscio.

Codice (Java): [Seleziona]
                /* Simple Adapter */

                ArrayList<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>();

                Cursor contacts = getContentResolver().query(
                                ContactsContract.Contacts.CONTENT_URI, null, null, null, null);

                while (contacts.moveToNext()) {

                        HashMap<String, Object> contactMap = new HashMap<String, Object>();

                        Log.w("Contact", contacts.getString(contacts
                                        .getColumnIndex(PhoneLookup.DISPLAY_NAME)));

                        contactMap.put("name", contacts.getString(contacts
                                        .getColumnIndex(PhoneLookup.DISPLAY_NAME)));
    ----->              contactMap.put("number", contacts.getString(contacts
                                        .getColumnIndex(PhoneLookup.NUMBER)));

                        data.add(contactMap);

                }

Questo il logcat relativo
Codice: [Seleziona]
02-09 13:11:33.988: INFO/ActivityManager(65): Starting activity: Intent { cmp=com.programs.test/.ContactView }
02-09 13:11:34.428: WARN/Contact(547): Nome Cognome
02-09 13:11:34.428: ERROR/CursorWindow(547): Bad request for field slot 0,-1. numRows = 3, numColumns = 23
02-09 13:11:34.457: DEBUG/AndroidRuntime(547): Shutting down VM
02-09 13:11:34.457: WARN/dalvikvm(547): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
02-09 13:11:34.508: ERROR/AndroidRuntime(547): FATAL EXCEPTION: main
02-09 13:11:34.508: ERROR/AndroidRuntime(547): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.programs.test/com.programs.test.ContactView}: java.lang.IllegalStateException: get field slot from row 0 col -1 failed
02-09 13:11:34.508: ERROR/AndroidRuntime(547):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
02-09 13:11:34.508: ERROR/AndroidRuntime(547):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
02-09 13:11:34.508: ERROR/AndroidRuntime(547):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
02-09 13:11:34.508: ERROR/AndroidRuntime(547):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
02-09 13:11:34.508: ERROR/AndroidRuntime(547):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-09 13:11:34.508: ERROR/AndroidRuntime(547):     at android.os.Looper.loop(Looper.java:123)
02-09 13:11:34.508: ERROR/AndroidRuntime(547):     at android.app.ActivityThread.main(ActivityThread.java:4627)
02-09 13:11:34.508: ERROR/AndroidRuntime(547):     at java.lang.reflect.Method.invokeNative(Native Method)
02-09 13:11:34.508: ERROR/AndroidRuntime(547):     at java.lang.reflect.Method.invoke(Method.java:521)
02-09 13:11:34.508: ERROR/AndroidRuntime(547):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
02-09 13:11:34.508: ERROR/AndroidRuntime(547):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
02-09 13:11:34.508: ERROR/AndroidRuntime(547):     at dalvik.system.NativeStart.main(Native Method)
02-09 13:11:34.508: ERROR/AndroidRuntime(547): Caused by: java.lang.IllegalStateException: get field slot from row 0 col -1 failed
02-09 13:11:34.508: ERROR/AndroidRuntime(547):     at android.database.CursorWindow.getString_native(Native Method)
02-09 13:11:34.508: ERROR/AndroidRuntime(547):     at android.database.CursorWindow.getString(CursorWindow.java:329)
02-09 13:11:34.508: ERROR/AndroidRuntime(547):     at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:49)
02-09 13:11:34.508: ERROR/AndroidRuntime(547):     at android.database.CursorWrapper.getString(CursorWrapper.java:135)
02-09 13:11:34.508: ERROR/AndroidRuntime(547):     at com.programs.test.ContactView.onCreate(ContactView.java:43)
02-09 13:11:34.508: ERROR/AndroidRuntime(547):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
02-09 13:11:34.508: ERROR/AndroidRuntime(547):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
02-09 13:11:34.508: ERROR/AndroidRuntime(547):     ... 11 more
02-09 13:11:34.547: WARN/ActivityManager(65):   Force finishing activity com.programs.test/.ContactView
02-09 13:11:34.588: WARN/ActivityManager(65):   Force finishing activity com.programs.test/.Main
02-09 13:11:34.627: WARN/WindowManager(65): No window to dispatch pointer action 0
02-09 13:11:34.899: WARN/WindowManager(65): No window to dispatch pointer action 1
02-09 13:11:35.118: WARN/ActivityManager(65): Activity pause timeout for HistoryRecord{43f2a9d0 com.programs.test/.ContactView}
02-09 13:11:38.287: INFO/Process(547): Sending signal. PID: 547 SIG: 9
02-09 13:11:38.408: INFO/ActivityManager(65): Process com.programs.test (pid 547) has died.
02-09 13:11:38.408: INFO/WindowManager(65): WIN DEATH: Window{43fb76f8 com.programs.test/com.programs.test.Main paused=true}
02-09 13:11:42.779: DEBUG/dalvikvm(230): GC_EXPLICIT freed 144 objects / 10664 bytes in 196ms
02-09 13:11:47.006: WARN/ActivityManager(65): Activity destroy timeout for HistoryRecord{4402d6a8 com.programs.test/.Main}
02-09 13:11:47.087: WARN/ActivityManager(65): Activity destroy timeout for HistoryRecord{43f2a9d0 com.programs.test/.ContactView}

Grazie in anticipo :)
« Ultima modifica: 10 Febbraio 2011, 16:08:03 CET da Gambanera »

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Problema lettura contatti
« Risposta #1 il: 09 Febbraio 2011, 14:42:06 CET »
0
Caused by: java.lang.IllegalStateException: get field slot from row 0 col -1 failed
sembra che la colonna non esista con quel nome...
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Gambanera

  • Nuovo arrivato
  • *
  • Post: 27
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    Vodafone ideos
  • Play Store ID:
    Gambanera
  • Sistema operativo:
    Ubuntu 10.10 / Windows 7
Re:Problema lettura contatti
« Risposta #2 il: 10 Febbraio 2011, 16:07:42 CET »
+3
Alla fine ho risolto in questo modo:

Codice (Java): [Seleziona]
Cursor cursor = context.getContentResolver().query(
                                ContactsContract.Contacts.CONTENT_URI, null, null, null, null);

                while (cursor.moveToNext()) {

                        String contactId = cursor.getString(cursor
                                        .getColumnIndex(Contacts._ID));

                        String name = cursor.getString(cursor
                                        .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

                        String hasPhone = cursor
                                        .getString(cursor
                                                        .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));


                        if (!Boolean.parseBoolean(hasPhone)) {

                                Cursor phones = context.getContentResolver().query(
                                                ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                                                null,
                                                ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                                                                + " = " + contactId, null, null);

                                while (phones.moveToNext()) {
                                        String number = phones
                                                        .getString(phones
                                                          .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

                                }
                                phones.close();
                        }
                }

                cursor.close();

Magari a qualcuno potrà servire :)

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re:Problema lettura contatti
« Risposta #3 il: 11 Febbraio 2011, 10:40:26 CET »
0
Scusate, a partire da questo codice ho notato che si ferma a leggere solo il numero di telefono di default...domanda : e se un contatto a più numeri di telefono ???

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Problema lettura contatti
« Risposta #4 il: 11 Febbraio 2011, 13:03:34 CET »
+1
Scusate, a partire da questo codice ho notato che si ferma a leggere solo il numero di telefono di default...domanda : e se un contatto a più numeri di telefono ???
lui ha fatto:
Codice (Java): [Seleziona]
  while (phones.moveToNext()) {
                                        String number = phones
                                                        .getString(phones
                                                          .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

                                }
tu potresti fare una cosa tipo:
Codice (Java): [Seleziona]
String[] numbers = new String[phones.size()];
int i = 0;
  while (phones.hasNext()) {
phones.moveToNext();
                                        numbers[i] = phones
                                                        .getString(phones
                                                          .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
i++;
                                }
perdonami se ho sbagliato i nomi di alcuni metodi (controlla hasNext e phones.size()) ma dovrebbe essere una cosa del genere
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re:Problema lettura contatti
« Risposta #5 il: 11 Febbraio 2011, 19:08:12 CET »
0
Nicola anche qui mi rispondi :) grazie provo questo metodo allora ;)

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Problema lettura contatti
« Risposta #6 il: 11 Febbraio 2011, 19:09:12 CET »
0
Nicola anche qui mi rispondi :) grazie provo questo metodo allora ;)

io sono ovunque...
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re:Problema lettura contatti
« Risposta #7 il: 12 Febbraio 2011, 13:46:59 CET »
0
Ho un problemino....per visualizzare i contatti ho utilizzato un simple adapter quindi il codice per creare la lista List<? extends Map<String,String>> è questo :

Codice (Java): [Seleziona]
private List<? extends Map<String, ?>> list() {
                Map<String,String> numbers = null;
                Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
                ArrayList<Map<String,String>> lista = new ArrayList<Map<String,String>>();
                //ids = new ArrayList<Integer>();
                while (cursor.moveToNext()) {
                        contactId = cursor.getInt(cursor.getColumnIndex(Contacts._ID));
                        String inte = Integer.toString(contactId);
                        String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                        String hasPhone = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));

                        if (!Boolean.parseBoolean(hasPhone)) {
                                        Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null);
                                        int n = phones.getCount();
                                        //numbers = new String[n];
                                        int i = 0;
                                        for(i=0;i<=n-1;i++){
                                                //ids.add(contactId);
                                                numbers = new HashMap<String,String>();
                                                numbers.put("nome", name);
                                                phones.moveToNext();
                                                String num = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                                    numbers.put("numero",num);
                                    numbers.put("id", inte);
                                    lista.add(numbers);
                                }
                                        phones.close();
                        }
                }
        cursor.close();
        return lista;
        }

il problema è che è poco performante, la listview mi esce dopo 3/4 secondi....secondo voi che può essere ? è vero che ci sono dei while però ho visto altri programmi che fanno la stessa cosa mia e la listview esce istantanea....forse è colpa di questo pezzo ?

Codice (Java): [Seleziona]
for(i=0;i<=n-1;i++){
                                                //ids.add(contactId);
                                                numbers = new HashMap<String,String>();
                                                numbers.put("nome", name);
                                                phones.moveToNext();
                                                String num = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                                    numbers.put("numero",num);
                                    numbers.put("id", inte);
                                    lista.add(numbers);
                                }

che voi sappiate il ciclo for è più lento del while ?? nel caso che posso usare in alternativa ??

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Problema lettura contatti
« Risposta #8 il: 12 Febbraio 2011, 13:57:05 CET »
0
il while o il for sono "lenti" uguali.
La loro lentezza dipende dal numero di iterazioni che fanno.
il tuo i<=n-1 quante volte cicla? quanti contatti prendi? tutto il telefono? mille,1,2? dipende da quello.
Io credo che la lentezza sia a causa dell'arraylist di map<string,string>,non tanto nei cicli..
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re:Problema lettura contatti
« Risposta #9 il: 12 Febbraio 2011, 14:10:09 CET »
0
bhe prendo tutti i contatti saranno in tutto 500 numeri volendo esagerare il problema è che altre applicazioni ugualimi danno la stessa lista in mezzo secondo...se come dici tu è l'arraylist che rallenta come cavoloposso ovviare ? il simple adapter vuole il list.... :(

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Problema lettura contatti
« Risposta #10 il: 12 Febbraio 2011, 14:17:27 CET »
0
bhe prendo tutti i contatti saranno in tutto 500 numeri volendo esagerare il problema è che altre applicazioni ugualimi danno la stessa lista in mezzo secondo...se come dici tu è l'arraylist che rallenta come cavoloposso ovviare ? il simple adapter vuole il list.... :(

Usa un cursor adapter!
L'implementazione è un po' più complicata ma sicuramente è più efficiente.

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re:Problema lettura contatti
« Risposta #11 il: 12 Febbraio 2011, 15:20:41 CET »
0
Dici che il SimpleCursorAdapter è meglio ? ma che cambia ? invece del list gli devo passare un cursor e poi nel getView devo comunque usare il list per andare a riprendermi i dati dei vari numeri di telefono quindi alla fine  nel getView devo effettuare tutte le operazioni che effettuo nella classe list() compreso l'utilizzo dell'ArrayList e dei Map....

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re: Problema lettura contatti
« Risposta #12 il: 12 Febbraio 2011, 15:36:13 CET »
0
Ti piace vincere facile eh? :D
Io parlavo di CursorAdapter! L'idea è quella di evitare di creare e popolare una struttura dati come una List o una HashMap perché è oneroso.
Oppure potresti inizialmente presentare solo la lista dei nomi, poi quando l'utente preme su uno di essi vai a caricare la lista dei numeri e la mostri in un dialog :)

Sent from my HTC Desire using Tapatalk

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re:Problema lettura contatti
« Risposta #13 il: 12 Febbraio 2011, 16:48:32 CET »
0
Domanda stupida: ma gli INNER JOIN esistono?

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re:Problema lettura contatti
« Risposta #14 il: 12 Febbraio 2011, 23:36:10 CET »
0
Se si potesse fare un join tra queste 2 tabelle risolverei :
 Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
 Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null);

ma come fare un JOIN con il content provider ?? :(