Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

get contact info from android contact picker

I'm trying to call the contact picker, get the persons name, phone and e-mail into strings and send them to another activity using an intent. So far this works:

Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);   startActivityForResult(intent, 1);    // ...  @Override   public void onActivityResult(int reqCode, int resultCode, Intent data) {       super.onActivityResult(reqCode, resultCode, data);       if (resultCode == Activity.RESULT_OK) {           Uri contactData = data.getData();           Cursor c =  managedQuery(contactData, null, null, null, null);           if (c.moveToFirst()) {               String name = c.getString(c.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));               Intent intent = new Intent(CurrentActivity.this, NewActivity.class);               intent.putExtra("name", name);               startActivityForResult(intent, 0);           }       }   } 

But if i add in:

String number = c.getString(c.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER));  

it force closes

Maybe theres another way to get their number?

like image 491
ng93 Avatar asked Jun 15 '10 11:06

ng93


People also ask

How do you use contact picker?

Opening the Contact Picker #contacts. select() . When called, it returns a promise and shows the contact picker, allowing the user to select the contact(s) they want to share with the site. After selecting what to share and clicking Done, the promise resolves with an array of contacts selected by the user.

How do I show contact names and numbers on Android?

Display Only Android Contacts with Phone Numbers. Open your Contacts app and tap the Options button (three dots), and select Contacts Manager. On the next screen, tap on Contacts to display from the menu.

What is contact picker API?

The Contact Picker API allows users to select entries from their contact list and share limited details of the selected entries with a website or application.


2 Answers

Phone Numbers

Phone numbers are stored in their own table and need to be queried separately. To query the phone number table use the URI stored in the SDK variable ContactsContract.CommonDataKinds.Phone.CONTENT_URI. Use a WHERE conditional to get the phone numbers for the specified contact.

    if (Integer.parseInt(cur.getString(            cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {         Cursor pCur = cr.query(         ContactsContract.CommonDataKinds.Phone.CONTENT_URI,          null,          ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",          new String[]{id}, null);         while (pCur.moveToNext()) {         // Do something with phones         }          pCur.close();     } 

Perform a second query against the Android contacts SQLite database. The phone numbers are queried against the URI stored in ContactsContract.CommonDataKinds.Phone.CONTENT_URI. The contact ID is stored in the phone table as ContactsContract.CommonDataKinds.Phone.CONTACT_ID and the WHERE clause is used to limit the data returned.

Email Addresses

Querying email addresses is similar to phone numbers. A query must be performed to get email addresses from the database. Query the URI stored in ContactsContract.CommonDataKinds.Email.CONTENT_URI to query the email address table.

Cursor emailCur = cr.query(          ContactsContract.CommonDataKinds.Email.CONTENT_URI,          null,         ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?",          new String[]{id}, null);      while (emailCur.moveToNext()) {          // This would allow you get several email addresses             // if the email addresses were stored in an array         String email = emailCur.getString(                       emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));         String emailType = emailCur.getString(                       emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));      }      emailCur.close(); 

As with the phone query the field names for the email table are also stored under ContactsContract.CommonDataKinds. The email query is performed on the URI in ContactsContract.CommonDataKinds.Email.CONTENT_URI and the WHERE clause has to match the ContactsContract.CommonDataKinds.Email.CONTACT_ID field. Since multiple email addresses can be stored loop through the records returned in the Cursor.

More tutorials here

This method requires Android API version 5 or higher.

like image 63
Pentium10 Avatar answered Nov 02 '22 22:11

Pentium10


Building on the accepted answer, if you want to jump straight to the desired email address and not require the contacts permission use something like this:

private static final int REQUEST_CODE_EMAIL = 1;  void startSelectingEmail() {     Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Email.CONTENT_URI);     startActivityForResult(intent, REQUEST_CODE_EMAIL); }  @Override public void onActivityResult(int requestCode, int resultCode, Intent data) {     super.onActivityResult(requestCode, resultCode, data);     if (resultCode == Activity.RESULT_OK && requestCode == REQUEST_CODE_EMAIL) {         Uri emailUri = data.getData();         Cursor emailCursor = getContext().getContentResolver().query(emailUri, null, null, null, null);         if (emailCursor != null) {             if (emailCursor.moveToFirst()) {                 String email = emailCursor.getString(                         emailCursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Email.DATA));                 String emailType = emailCursor.getString(                         emailCursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Email.TYPE));                 Log.d(TAG, "Email: " + emailType + " " + email);             }             emailCursor.close();         }     } } 

This doesn't require the contacts permission to read the email address like the double query methods above. It also makes it so that you do not need to write UI for the user to select the appropriate email address for contacts with multiple emails, the user selects a specific email in the Contacts app so you only get one result.

The cursor comes back with quite a few columns in addition to just email address like display name, though that has only been verified on a Nexus 5 running Android M.

like image 26
caller9 Avatar answered Nov 03 '22 00:11

caller9