1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

eMailpicker

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Chaoz, 26.04.2010.

  1. Chaoz, 26.04.2010 #1
    Chaoz

    Chaoz Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    141
    Erhaltene Danke:
    12
    Registriert seit:
    23.03.2010
    Phone:
    Nexus One
    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);
        }
    
    }
     
  2. klausa2, 26.04.2010 #2
    klausa2

    klausa2 Fortgeschrittenes Mitglied

    Beiträge:
    298
    Erhaltene Danke:
    20
    Registriert seit:
    08.07.2009
  3. Chaoz, 26.04.2010 #3
    Chaoz

    Chaoz Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    141
    Erhaltene Danke:
    12
    Registriert seit:
    23.03.2010
    Phone:
    Nexus One
    Klingt ja an sich ganz nett, aber wie sag ich ihm dass er nach kontakte mit eMail filtern soll, wenn ich nichtmal weiss wie ich von nem kontakt die eMail bekomm? =/
     
  4. klausa2, 27.04.2010 #4
    klausa2

    klausa2 Fortgeschrittenes Mitglied

    Beiträge:
    298
    Erhaltene Danke:
    20
    Registriert seit:
    08.07.2009
    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: 27.04.2010
    Chaoz bedankt sich.
  5. Chaoz, 27.04.2010 #5
    Chaoz

    Chaoz Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    141
    Erhaltene Danke:
    12
    Registriert seit:
    23.03.2010
    Phone:
    Nexus One
    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: 27.04.2010
  6. Chaoz, 27.04.2010 #6
    Chaoz

    Chaoz Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    141
    Erhaltene Danke:
    12
    Registriert seit:
    23.03.2010
    Phone:
    Nexus One
    (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 ;-)
     
  7. klausa2, 27.04.2010 #7
    klausa2

    klausa2 Fortgeschrittenes Mitglied

    Beiträge:
    298
    Erhaltene Danke:
    20
    Registriert seit:
    08.07.2009
    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.
     
    Chaoz bedankt sich.
  8. Chaoz, 27.04.2010 #8
    Chaoz

    Chaoz Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    141
    Erhaltene Danke:
    12
    Registriert seit:
    23.03.2010
    Phone:
    Nexus One
    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
     
  9. klausa2, 27.04.2010 #9
    klausa2

    klausa2 Fortgeschrittenes Mitglied

    Beiträge:
    298
    Erhaltene Danke:
    20
    Registriert seit:
    08.07.2009
    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: 27.04.2010
  10. Chaoz, 28.04.2010 #10
    Chaoz

    Chaoz Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    141
    Erhaltene Danke:
    12
    Registriert seit:
    23.03.2010
    Phone:
    Nexus One
    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();
     
  11. klausa2, 28.04.2010 #11
    klausa2

    klausa2 Fortgeschrittenes Mitglied

    Beiträge:
    298
    Erhaltene Danke:
    20
    Registriert seit:
    08.07.2009
    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: 28.04.2010
  12. Chaoz, 28.04.2010 #12
    Chaoz

    Chaoz Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    141
    Erhaltene Danke:
    12
    Registriert seit:
    23.03.2010
    Phone:
    Nexus One
    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
     
  13. klausa2, 28.04.2010 #13
    klausa2

    klausa2 Fortgeschrittenes Mitglied

    Beiträge:
    298
    Erhaltene Danke:
    20
    Registriert seit:
    08.07.2009
    Umso besser.

    Aus purer Neugier: Was schreibst Du eigentlich für eine App? (Falls das kein Geheimnis ist)
     
  14. Chaoz, 28.04.2010 #14
    Chaoz

    Chaoz Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    141
    Erhaltene Danke:
    12
    Registriert seit:
    23.03.2010
    Phone:
    Nexus One
    an ner eierlegenden wollmilchsau was enterprise & cloudcomputing anbelangt ;-)
    (viel mehr darf ich au nich sagen, sonst gibtz stress mitn chef, launch is zur droidCon ... )
     
  15. Flash Doc, 18.05.2010 #15
    Flash Doc

    Flash Doc Neuer Benutzer

    Beiträge:
    4
    Erhaltene Danke:
    0
    Registriert seit:
    18.05.2010
    Phone:
    HTC Desire
    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
     

Diese Seite empfehlen