3D-kreativ
3D-kreativ

Reputation: 9319

Can't get the email address from ContactsContract

I'm trying to get the email address from the ContactsContract, but I only get an empty string! Name and number is working fine, but not the email address!

I confused and have been trying to solve this for days now, but I don't know what's wrong, if I have missed something in the code or what and I don't know how to solve this.

This part of the application has a ListView of all names from the ContactsContract. When selecting a name in the ListView, the code should get the name, number and email address from the ContactsContract.

I would appreciate some help to be able to continue the work! Perhaps there is a better way to solve this, then please tell me how to change! Thanks!

Since toast message doesn't show up inside the while loop, while(cursorEmail.moveToFirst()){.... I guess there is something wrong with the emails cursor!? It seems like it's empty!?

public class Activity_3 extends Activity {

ListView listView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_3);
    listView = (ListView) findViewById(R.id.contactList);

    String[] projection = { ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, 
            ContactsContract.CommonDataKinds.Phone.NUMBER,
            ContactsContract.CommonDataKinds.Phone._ID };

    Cursor cursor1 = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection, null, null, null);

    // From column
    String[] fromColumn = { ContactsContract.Contacts.DISPLAY_NAME };
    // To view
    int[] toView = { R.id.contactItem };

    startManagingCursor(cursor1);

    ListAdapter adapter = new SimpleCursorAdapter(this, R.layout.activity_3, cursor1, fromColumn, toView);

    listView.setAdapter(adapter);

    listView.setOnItemClickListener(new OnItemClickListener() {

        public void onItemClick(AdapterView<?> adapter, View view, int position, long id) {

            String[] projection = { ContactsContract.CommonDataKinds.Phone._ID, 
                    ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, 
                    ContactsContract.CommonDataKinds.Phone.NUMBER,
                    };

            Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection, null, null, null);

            cursor.moveToPosition(position);

            String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
            String contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
            String contactNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

            String pos = Integer.toString(position);

            String contactEmailAddress = "?";   
            //Email
            Cursor emails = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + "=" + contactId, null,  null);

            while(emails.moveToNext()){
                contactEmailAddress = emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
                Toast.makeText(Activity_3.this, contactEmailAddress, Toast.LENGTH_SHORT).show();
            }
            emails.close();

            Toast.makeText(Activity_3.this, pos + " " + contactId + " " + contactName + " " + contactNumber + " " + contactEmailAddress, Toast.LENGTH_SHORT).show();
        }
    });
}

}

Upvotes: 3

Views: 5841

Answers (5)

Sanket Kachhela
Sanket Kachhela

Reputation: 10876

use this

String email = "";  
            try {  
                Uri result = data.getData();  
                Log.v(DEBUG_TAG, "Got a contact result: "  
                        + result.toString());  
                // get the contact id from the Uri  
                String id = result.getLastPathSegment();  
                // query for everything email  
                cursor = getContentResolver().query(Email.CONTENT_URI,  
                        null, Email.CONTACT_ID + "=?", new String[] { id },  
                        null);  
                int emailIdx = cursor.getColumnIndex(Email.DATA);  
                // let's just get the first email  
                if (cursor.moveToFirst()) {  
                    email = cursor.getString(emailIdx);  
                    Log.v(DEBUG_TAG, "Got email: " + email);  
                } else {  
                    Log.w(DEBUG_TAG, "No results");  
                }  
            } catch (Exception e) {  
                Log.e(DEBUG_TAG, "Failed to get email data", e);  
            } finally {  
                if (cursor != null) {  
                    cursor.close();  
                } 

               edtCustomerEmailid.setText(email);

              //Toast.makeText(getApplicationContext(), email, 1).show();
                if (email.length() == 0) {  
                    Toast.makeText(this, "No email found for contact.",  
                            Toast.LENGTH_LONG).show();  
                }  
            } 

Upvotes: 0

Artem Zelinskiy
Artem Zelinskiy

Reputation: 2210

ContentResolver cr = this.getContext().getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null);
if (cur.getCount() > 0) {
    while (cur.moveToNext()) {
        String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
        Cursor cur1 = cr.query( 
                ContactsContract.CommonDataKinds.Email.CONTENT_URI, null,
                ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", 
                        new String[]{id}, null); 
        while (cur1.moveToNext()) { 
            //to get the contact names
            String name=cur1.getString(cur1.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
            String email = cur1.getString(cur1.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));



        } 
        cur1.close();
    }
}

Upvotes: 0

stinepike
stinepike

Reputation: 54742

Here I am posting a working method which will return you the mail id or null(if not available) by a contact id.

public static String getEmail(Context c, long id) {
        Uri uri = ContactsContract.CommonDataKinds.Email.CONTENT_URI;
        String[] projection = new String[] {
                ContactsContract.CommonDataKinds.Email._ID,
                ContactsContract.CommonDataKinds.Email.CONTACT_ID,
                ContactsContract.CommonDataKinds.Email.ADDRESS,
                ContactsContract.CommonDataKinds.Email.TYPE };
        String selection = ContactsContract.CommonDataKinds.Email.CONTACT_ID
                + " = '" + id + "'";
        String sortOrder = ContactsContract.CommonDataKinds.Email.ADDRESS
                + " COLLATE LOCALIZED ASC";

        Cursor cursor = c.getContentResolver().query(uri, projection,
                selection, null, sortOrder);

        int index = cursor
                .getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS);
        if (cursor.moveToNext()) {
            return cursor.getString(index);
        }
        return null;
    }

Upvotes: 0

Santhosh
Santhosh

Reputation: 1962

You need to get the contacts list with details with the following code. The following method will return all contacts with name, phone number and email.

public ArrayList<ContactDO> getContacts()
{
    ArrayList<ContactDO> alContacts = null;
    Cursor cursor = contResv.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
    if(cursor.moveToFirst())
    {
        alContacts = new ArrayList<ContactDO>();
        do
        {
            //Create a plain class with following variables - id, name, contactNumber, email
            ContactDO objContactDO = new ContactDO();

            objContactDO.name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));       
            objContactDO.id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));

            Cursor emails = contResv.query(Email.CONTENT_URI,null,Email.CONTACT_ID + " = " + objContactDO.id, null, null);
            while (emails.moveToNext()) 
            { 
                objContactDO.email = emails.getString(emails.getColumnIndex(Email.DATA));
                break;
            }
            emails.close();

            if(Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0)
            {
                Cursor pCur = contResv.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",new String[]{ objContactDO.id }, null);
                while (pCur.moveToNext()) 
                {
                    objContactDO.contactNumber = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                    break;
                }
                pCur.close();
            }

            alContacts.add(objContactDO);

        } while (cursor.moveToNext()) ;
    } 

    cursor.close(); 
    return alContacts;
}

Create a custom adapter and set it to listview.

lvContacts.setAdapter(adapter = new CustomContactsAdapter(getContacts()));

Upvotes: 12

patrickwlarsen
patrickwlarsen

Reputation: 168

Assuming you've got the id for the specific contact you're about to get the email address for, here is a snippet of code i made a while back when i tried to do the same as you do now:

First you'll want to get the id for the contact:

    ContentResolver cr  = context.getContentResolver();
    Cursor cursor       = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
    id                  = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));

Then you can fetch the email address by doing this:

            String contactAddress   = "";
            Cursor cursorEmail      = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,
                                            null, 
                                            ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?",
                                            new String[] {id}, 
                                            null);
            if(cursorEmail.moveToFirst()) {
                contactAddress = cursorEmail.getString(cursorEmail.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
            }

Remember that a contact does not necessarily have an email, so you should ofcourse take that into account :-)

Edit: Took a better look at your code and compared it to what i've pasted here. It seems to be that your problem lies in the paramters selection and selectionArgs. What you want to do is get the id of the contact you're getting the email address for and then change your selection to:

ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?"

and add the id in the selectionArgs like this:

new String[] {id}

Upvotes: 3

Related Questions