How to call Android contacts list AND Select one phone number from its details screen?

phew, it took me some time, but i think i have the answer you need (even if it’s too late already, but i’ll still post it as a reference for others).

in the application i’m currently developing the user may enter a phone number into
an EditText or click on a button and select a person from the phones address book. if the person has more than one phone number, there’s a drop down list where he can select exactly one of them.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.contact_picker);

    // this opens the activity. note the  Intent.ACTION_GET_CONTENT
    // and the intent.setType
    ((Button)findViewById(R.id.pick_person)).setOnClickListener( new OnClickListener() {
        @Override
        public void onClick(View v) {
            // user BoD suggests using Intent.ACTION_PICK instead of .ACTION_GET_CONTENT to avoid the chooser
            Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
            // BoD con't: CONTENT_TYPE instead of CONTENT_ITEM_TYPE
            intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
            startActivityForResult(intent, 1);                
        }
    });
}

now, as soon as the user selects a contact (and probably chooses one of several phone numbers), you can retrieve the data the normal way:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (data != null) {
        Uri uri = data.getData();

        if (uri != null) {
            Cursor c = null;
            try {
                c = getContentResolver().query(uri, new String[]{ 
                            ContactsContract.CommonDataKinds.Phone.NUMBER,  
                            ContactsContract.CommonDataKinds.Phone.TYPE },
                        null, null, null);

                if (c != null && c.moveToFirst()) {
                    String number = c.getString(0);
                    int type = c.getInt(1);
                    showSelectedNumber(type, number);
                }
            } finally {
                if (c != null) {
                    c.close();
                }
            }
        }
    }
}

public void showSelectedNumber(int type, String number) {
    Toast.makeText(this, type + ": " + number, Toast.LENGTH_LONG).show();      
}

here’s the documentation for CommonDataKinds.Phone for on dev.android.

the int “type” tells you the type of number: mobile (2), home (1), work (3), and so on.

note: after the user selects the contact, he gets a spinner of numbers with no indication of the numbers type. that’s not really user friendly: if a contact has 5 assigned numbers … uh, which one of these is the fax number again?

another note: above example needs the sdk > 5 (Android 2.0+), so no 1.6 (=sdk 4). 1.6 has a different api, and if you want to support both versions, read the article about the contacts API on dev.android.

good luck.

disclaimer: i copied most of my code out of the PickContact.java example

Leave a Comment