Android Kontakte auslesen und in Liste darstellen

tobi193

Aktives Mitglied
Hallo,

ich möchte in einer Android App alle Kontakte auslesen und einer Liste (als Alert) darstellen.
Das klappt mit nachfolgendem Code auch soweit. Allerdings ist der absolut ineffizient. Er lädt da selbst bei einem Top Gerät eine halbe Ewigkeit für die (wenigen) Kontakte.
Außerdem werden mir alle mehrfach angezeigt.

Auch die Darstellung mit einem Umweg über eine LinkedList ist ziemlich suboptimal. Aber ich habe absolut keine Idee wie man es anders lösen könnte. Weiß da jemand Rat ?

Java:
 public void contactPicker(View view) {  
    if(list.isEmpty()){
        Cursor rawContacts = managedQuery(RawContacts.CONTENT_URI, projection, null, null, null);

        if(rawContacts.moveToFirst()){
            while(!rawContacts.isAfterLast()){		
                int contactId = rawContacts.getInt(rawContacts.getColumnIndex(RawContacts.CONTACT_ID));
                Cursor contact = managedQuery(Contacts.CONTENT_URI, contact_value, Contacts._ID + "=?", new String[]{String.valueOf(contactId)}, null);
                if(contact.moveToFirst()){
                    Cursor phone = managedQuery(Phone.CONTENT_URI, contact_phone, Data.CONTACT_ID + "=?",new String[]{String.valueOf(contactId)}, null);
                    if(phone.moveToFirst()) {

                        while(!phone.isAfterLast()){
                            list.add(new Kontakt(contact.getString(contact.getColumnIndex(Contacts.DISPLAY_NAME)), phone.getString(phone.getColumnIndex(Phone.NUMBER))));
                            //message(contact.getString(contact.getColumnIndex(Contacts.DISPLAY_NAME)) + " " + phone.getString(phone.getColumnIndex(Phone.NUMBER)));
                            phone.moveToNext();
                        }
                    }
                    phone.close();               
                    contact.close();
                }
                rawContacts.moveToNext();			
            }
        }

        CharSequence[] cs = new CharSequence[list.size()];
        int i = 0;
        for(Kontakt k : list){
            cs[i] = k.getName();
            i++;
        }
        builder = new AlertDialog.Builder(this);
        builder.setTitle("Kontakte");
        builder.setCancelable(true);
        builder.setItems(cs, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int item) {
                setContact(list.get(item));
            }
        });
        alert = builder.create();
    }
    alert.show();
  }
 

diel2001

Bekanntes Mitglied
Verwende einfach ein Set !
Wenn die equals methode von Kontakt überschrieben ist, dann dürftest du keine doppelten Einträge haben.
 
N

nillehammer

Gast
Ich kenn mich mit der Android-API nicht aus, aber die vielen Cursor-Objekte in den vielen verschachtelten Schleifen sehen "smelly" aus. Versuch mal, ob Du die Daten nicht direkt aus einem der Returnvalues (z.B. rawContact, contact etc.) herausholen kannst, ohne wieder eine Query mit der ID zu machen.

Ansonsten zum Profiling baue jeweils als letzte Anweisung jeder Schleife ein Log-Statement mit der aktuellen Zeit ein, um zu sehen, wo die Zeit verbraten wird.
 

mjdv

Bekanntes Mitglied
Warum ließt du denn alle Raw Kontakte ein? Das macht doch keinen Sinn, lies nur die normalen Kontakte ein, bei denen die Informationen schon zusammengefasst sind.

Des weiteren ließt du jede Nummer ein, aber zeigst nur die Namen an. Ließ die Nummern nur ein wenn du sie auch brauchst. Also erst wenn du den Kontakt mit seinen Daten auch anzeigst.

Dann hast du nur einen Cursor durch den du durch gehst und der Spaß dauert nur ein paar ms.
 

tobi193

Aktives Mitglied
So, ich habe es jetzt etwas optimiert bekommen.
Die Ladezeit hat sich deutlich verkürzt und es werden alle Kontakte auch korrekt und nur einmal angezeigt. Außerdem sind sie so auch in alphabetischer Reihenfolge sortiert. Nur die unschöne Sache mit der Übertragung der LinkedList in ein Array ist noch vorhanden. Hier mein Quellcode dazu:

Java:
if(list.isEmpty()){
        cr = getContentResolver();
        Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, 
                              new String[]{ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.HAS_PHONE_NUMBER},  // Diese Spalten sollen ausgelesen werden
                              ContactsContract.Contacts.IN_VISIBLE_GROUP + " = 1", 
                              null, 
                              ContactsContract.Contacts.DISPLAY_NAME);
        
        if(cur.getCount() > 0){
	    while(cur.moveToNext()) {
	        String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
		String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
 		
                if(Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
 		    Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,new String[]{Phone.NUMBER, Phone.TYPE},ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",new String[]{id}, null);
                    while(pCur.moveToNext()){
                        if(pCur.getInt(pCur.getColumnIndex(Phone.TYPE)) == Phone.TYPE_MOBILE){
                            list.add(new Kontakt(name, pCur.getString(pCur.getColumnIndex(Phone.NUMBER))));
                            break;
                        }
                    }
                    pCur.close();
 	        }
            }
 	}

        CharSequence[] cs = new CharSequence[list.size()];
        int i = 0;
        for(Kontakt k : list){
            cs[i] = k.getName();
            i++;
        }
        builder = new AlertDialog.Builder(this);
        builder.setTitle("Kontakte (" + list.size() + ")");
        builder.setCancelable(true);
        builder.setItems(cs, new DialogInterface.OnClickListener(){
            public void onClick(DialogInterface dialog, int item){
                setContact(list.get(item));
            }
        });
        alert = builder.create();
    }
    alert.show();
 

mjdv

Bekanntes Mitglied
Bist du dir sicher, dass die nicht mehrmals angezeigt werden, wenn ein Kontakt mehrere Mobil Nummern hat?

Was ist an dem Array schlimm? Ansonsten mach dir nen Custom Dialog und nutze gleich einen SimpleCursorAdapter für eine ListView.
 

tobi193

Aktives Mitglied
Also der Code sucht sich aktuell nur die Mobilnummer raus und beachtet alle anderen nicht. Wenn jemand mehrere hat, dann würde nur die erste angezeigt werden. Von daher ist es nicht ganz optimal, aber wer hat denn schon mehrere Mobilnummern ?
 

tobi193

Aktives Mitglied
Jetzt fehlt nur noch eine Möglichkeit den SMS Verlauf des ausgewählten Kontakts zu öffnen sofern dieser denn vorhanden ist. Geht das irgendwie ? Ich habe bei Google nichts gefunden.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Android Android Addressbuch Kontakte und Bilder auslesen? Android & Cross-Platform Mobile Apps 1
W App Signaturschlüssel auslesen Android & Cross-Platform Mobile Apps 2
S Sinnvollste weg eine SQLite DB mit Android auslesen Android & Cross-Platform Mobile Apps 7
DorFey Arraywerte in Logcat auslesen Android & Cross-Platform Mobile Apps 0
L Android Android Contacts DB auslesen Android & Cross-Platform Mobile Apps 1
S Android Apk Daten auslesen Android & Cross-Platform Mobile Apps 6
M QR-Code auslesen mit Tabletkamera Android & Cross-Platform Mobile Apps 3
A Android veränderbares Array abspeichern und auslesen Android & Cross-Platform Mobile Apps 7
B Android WebView HTML Quelltext auslesen? Android & Cross-Platform Mobile Apps 6
A Android Datei erstellen/schreiben/auslesen Android & Cross-Platform Mobile Apps 1
G Auslesen von RFID mit dem Handy Android & Cross-Platform Mobile Apps 3
M Akkustand auslesen? Android & Cross-Platform Mobile Apps 4
J Android Textdatei aus dem Internet auslesen und ausgeben Android & Cross-Platform Mobile Apps 2
M Quellcode einer Website auslesen Android & Cross-Platform Mobile Apps 5
S Daten aus Android Gerät auslesen Android & Cross-Platform Mobile Apps 3
M Android Version auslesen Android & Cross-Platform Mobile Apps 7
L Android Datei erstellen, Daten einspeichern und auslesen Android & Cross-Platform Mobile Apps 2
P Android XML Auslesen und bearbeiten Android & Cross-Platform Mobile Apps 5
I Android WebKit: Seite auslesen (Nur Quellcode) Android & Cross-Platform Mobile Apps 12
MisterSeven Java ME Kalender- und Kontaktdaten von Telefon auslesen Android & Cross-Platform Mobile Apps 3
7 GPS-Daten auslesen auf Samsung SGH I900 Omnia Android & Cross-Platform Mobile Apps 3
G GPS am Nokia Handy auslesen (Anfänger) Android & Cross-Platform Mobile Apps 15
T SMS auslesen / SIM-Karte "simulieren" Android & Cross-Platform Mobile Apps 5
M Problem mit dem Auslesen von System Properties Android & Cross-Platform Mobile Apps 7
K XDA Orbit: Auslesen der GPS Daten mit J2ME Android & Cross-Platform Mobile Apps 2
M Daten aus Jad-file auslesen Android & Cross-Platform Mobile Apps 2
D Verzeichnis Liste auslesen? Android & Cross-Platform Mobile Apps 2
B bmiCalc (BodyMassIndex) - kein erfolgreiches auslesen Android & Cross-Platform Mobile Apps 4
T Tag und Uhrzeit auslesen Android & Cross-Platform Mobile Apps 4
I Android ListView, Werte aktualisieren ohne die Liste komplett neu zu laden Android & Cross-Platform Mobile Apps 5
J ArrayAdapter zeigt Liste nicht an Android & Cross-Platform Mobile Apps 0
N Android Liste neben Tablayout ? Android & Cross-Platform Mobile Apps 1
J Liste in Tab mit Fragments Android & Cross-Platform Mobile Apps 0
R [ANDROID] Dynamisch eine Liste erweitern Android & Cross-Platform Mobile Apps 3
N Android Liste zeigt Spalten falsch an Android & Cross-Platform Mobile Apps 2
K Liste sortieren Android & Cross-Platform Mobile Apps 3

Ähnliche Java Themen

Neue Themen


Oben