eMailpicker

Chaoz

Chaoz

Fortgeschrittenes Mitglied
13
Hi Leute,

ich hab aus dem Android SDK2.0 samples ne kleine app, die mir die contacts anzeigt.
Nur habe ich nun das problem, dass ich NUR contacts haben will, die mindestens eine eMail haben. =/

Irgend Jmd eine idee?

code:

Code:
package com.cortado;

import android.app.Activity;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.util.Log;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.CompoundButton.OnCheckedChangeListener;

public class ContactManager extends Activity {
    public static final String TAG = "ContactManager";

//    private Button mAddAccountButton;
    private ListView mContactList;

    /**
     * Called when the activity is first created. Responsible for initializing the UI.
     */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        Log.v(TAG, "Activity State: onCreate()");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.contact_manager);

        // Obtain handles to UI objects
        
        mContactList = (ListView) findViewById(R.id.contactList);

        // Initialize class properties

        // Register handler for UI elements
        
        // Populate the contact list
        populateContactList();
    }

    /**
     * Populate the contact list based on account currently selected in the account spinner.
     */
    private void populateContactList() {
        // Build adapter with contact entries
        Cursor cursor = getContacts();
        String[] fields = new String[] { ContactsContract.Data.DISPLAY_NAME };
        
        for(String s : fields)
        {
            System.out.println("#> " + s);
        }
        
        SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.contact_entry, cursor, fields, new int[] {R.id.contactEntryText});
        mContactList.setAdapter(adapter);
    }

    /**
     * Obtains the contact list for the currently selected account.
     *
     * @return A cursor for for accessing the contact list.
     */
    private Cursor getContacts()
    {
        // Run query
        Uri uri = ContactsContract.Contacts.CONTENT_URI;
        String[] projection = new String[] { ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME };
        
//        String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '" + (mShowInvisible ? "0" : "1") + "'";
        String[] selectionArgs = null;
        String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";

        return managedQuery(uri, projection, null, selectionArgs, sortOrder);
    }

}
 
Nicht ganz trivial. Contacts stecken in einer hierarchischen DB, deren Aufbau du hier findest;
Using the Contacts API | Android Developers

Die emails stecken in table DATA2 (data kind = Email.CONTENT_ITEM_TYPE).

Du musst Dir also eine entsprechendesquiery-sql basteln, wobei Du über die Contact._ID joinen kannst. Du erhältst dann aber erst mal alle email Adressen eines contacts, was Du vielleicht gar nicht willst, weil Dich z.B. nur die privaten oder nur geschäftliche interessieren. Also die quiery-sql evtl. noch weiter verfeinern.

Bei passender sql brauchst Du vermutlich auch gar keinen filter mehr.

Edit: hier habe ich ein einfaches Beispiel, das allerdings nicht das neue Contacts API verwendet:

http://github.com/commonsguy/cw-adv...ommonsware/android/database/ContactsDemo.java
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: Chaoz
Danke Klausa, ich werd es bei Gelegenheit mal ausprobieren und sag bescheid wenn ich es zum laufen bekommen hab. :)

Danke schonmal

edit:
mit der alten deprecated API krieg ich ja schon was raus, aber mir fehlt trotzdem noch ein einfacher ansatz wie ich aus dem Cursor ein "alle eMails zu name X" heraus krieg =/

gruß & Dank
Chaoz
 
Zuletzt bearbeitet:
(doppelpost -> sry)

mein momentaner code:

Code:
String[] PROJECTION = new String[] {
                Contacts.ContactMethods.DATA, Contacts.PeopleColumns.NAME
                };
        Cursor c = managedQuery(Contacts.ContactMethods.CONTENT_EMAIL_URI,
                PROJECTION, null, null, Contacts.ContactMethods.DEFAULT_SORT_ORDER);

String[] fields = new String[] {  Contacts.PeopleColumns.NAME, Contacts.ContactMethods.DATA};
        
        SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.contact_entry, c, fields, new int[] {R.id.contactEntryText, R.id.contactMail});

...nun muss ich nur all das deprecated zeux ersetzen...
Jegliche Hilfe ist gerne gesehen ;-)
 
Ich denke, es müsste so gehen:
Code:
            Cursor emails = getContentResolver().query( 
                    ContactsContract.CommonDataKinds.[B]Email[/B].CONTENT_URI, 
                    null, 
                    null, 
                    null, null); 

            while (emails.moveToNext()) { 
                String emailAddress = emails.getString( 
                                        emails.getColumnIndex( 
                                                ContactsContract.CommonDataKinds.CommonDataColumns.DATA)); 
                [ ... mach was damit... ] 
            } 
            emails.close();

Natürlich kannst Du auch eine projection angeben, und an einen cursoradapter geben.
 
  • Danke
Reaktionen: Chaoz
muha, super, hätt ich ohne dich sicher ewig dran gesessen :)
Traurig nur dass das ganze nie wirklich in den docs SO erwähnt wird, trivial ist anders.

THX =D
 
Leider schon wieder was gelernt, sorry. Nee, so gehts nicht. Man braucht ne Doppelschleife, sonst kriegt man nur eine emailadresse.
Code:
Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, 
                                                    null, null, null, null); 
        while (cursor.moveToNext()) { 
            String contactId = cursor.getString(cursor.getColumnIndex( 
                                            ContactsContract.Contacts._ID)); 
            Cursor emails = getContentResolver().query( 
                    ContactsContract.CommonDataKinds.Email.CONTENT_URI, 
                    null, 
                    ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = " + contactId, 
                    null, 
                    null); 
 
            while (emails.moveToNext()) { 
                String emailAddress = emails.getString( 
                                        emails.getColumnIndex( 
                                                ContactsContract.CommonDataKinds.CommonDataColumns.DATA)); 
 
                [ ... mach was damit ... ] 
            } 
            emails.close(); 
        } 
        cursor.close();
 
Zuletzt bearbeitet:
hm... bei mir gings mit einer schleife o.o

..........mal was anderes... wie komm ich eigtl an die FaxNummer ran? Ich such mir grade n wolf in der doku

Code:
while (emails.moveToNext())
        { 
            String emailAddress =     emails.getString(emails.getColumnIndex( ContactsContract.CommonDataKinds.Email.DATA));
            String name =             emails.getString(emails.getColumnIndex( ContactsContract.Contacts.DISPLAY_NAME ));
            
            strNameAndMail.add(name +" \n("+ emailAddress+")");
            m_strRetvals.add(emailAddress);
        } 
        emails.close();
 
1. Schön, dass es mit einer Schleife geht. Aber ein Kontakt kann ja ,ehr als nur eine email-Adresse haben. Hast Du mal ausprobiert, ob Du alle bekommst? Sonst halt doch 2 Schleifen. Das gikt auch für die Telefonnummern.

2. So bekommst Du alle Telefonnummern, auch die Faxe:
Code:
                Cursor phones = getContentResolver().query( 
                          ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
                          null, 
                          null, 
                          null, null); 
                while (phones.moveToNext()) { 
                    String phoneNumber = phones.getString( 
                                            phones.getColumnIndex( 
                                                    ContactsContract.CommonDataKinds.Phone.NUMBER)); 
                    int typ =  phones.getInt(
                                            phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE)); 
 
                    [ ...  Verarbeitung... ]                                     
                } 
                phones.close();

So erfährst Du auch für jede Nummer deren Typ: Mobil. work, home, fax_home, fax_work, etc. Welche Typen es gibt siehst Du hier:
ContactsContract.CommonDataKinds.Phone | Android Developers

Natürlich kannst Du die gewünschten Telefonnummer-Type auch gleich in einer passenden WHERE der Query mitgeben, wobei es aber 2 Faxtypen gibt. nd natürlich kannst du dir auch hier den DISPLAY_NAME ebenso besorgen wie bei den emails.
 
Zuletzt bearbeitet:
kewl... =)

btw: das mit der "einen schleife" geht bei mir einwandfrei, ich habe pro kontakt 1-2 emailadressen und er gibt mir alle aus. (liegt doch eigtl au daran, dass ich ihm sag, dass er mir alle emails geben soll und ich denen dann den namen zuweis und nich umgekehrt?!)

so far
chaoz
 
Umso besser.

Aus purer Neugier: Was schreibst Du eigentlich für eine App? (Falls das kein Geheimnis ist)
 
an ner eierlegenden wollmilchsau was enterprise & cloudcomputing anbelangt ;-)
(viel mehr darf ich au nich sagen, sonst gibtz stress mitn chef, launch is zur droidCon ... )
 
Hallo,

ich bin zwar noch neu hier, aber mir brennt zu diesem Thema auch eine Frage auf den Nägeln:

Ich bastele mir gerade ein kleines Helferlein, das mir die Anzeigenamen von der Form "Vorname Name" in "Name, Vorname" automatisiert umstellt. Jedesmal, wenn ich mein Handy mit Outlook synchronisiert habe, stehen ja die Namen wieder verkehrt.

Ich habe die App schon ziemlich weit, nur musste ich bei den Tests auf dem Gerät feststellen, dass auch meine ganzen Facebook-Kontakte für die Bearbeitung mit ausgelesen werden. Ich möchte aber nur die Kontakte bearbeiten, die nicht Facebook-Kontakte sind.

Mit welchen Query-Parametern kann ich eine entsprechende Unterscheidung einstellen? Gibt es überhaupt eine Möglichkeit der Unterscheidung.

Ich würde mich freuen, wenn mir jemand hier im Rund einen Tipp geben würde. Bin noch neu auf dem Gebiet der Android-Programmierung.

Gruß vom Flash Doc
 
Zurück
Oben Unten