6

With my present code I am getting only the contact number. But I want to get contact's name and contact's photo path. Have tried many codes by googling, but I am not able to get it done. Tried this too, but got FileNotFoundException. Can someone please help me achieve that by adding code snippets to the below code?

public void getContact(View view)
{

         Intent intent = new Intent(Intent.ACTION_PICK);
         intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
         startActivityForResult(intent, 1); 

}

protected void onActivityResult(int requestCode, int resultCode,Intent data)
    {
        super.onActivityResult(requestCode, resultCode, data);

             if(resultCode==RESULT_OK && requestCode == 1)
        {
            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 phoneNumber = c.getString(0);
                            int type = c.getInt(1);      
                        }
                    } finally {
                        if (c != null) {
                            c.close();
                        }
                    }
                }
            }
        }
         }
Community
  • 1
  • 1
Apparatus
  • 411
  • 1
  • 5
  • 19

2 Answers2

11

This code traverses all contacts and gets their first name, last name and photo as a bitmap:

Cursor cursor = App
            .getInstance()
            .getContentResolver()
            .query(ContactsContract.Contacts.CONTENT_URI, null, null, null,
                    null);

    if (cursor != null && cursor.getCount() > 0) {
        while (cursor.moveToNext()) {
            long id = cursor.getLong(cursor.getColumnIndex(ContactsContract.Contacts._ID));

            // get firstName & lastName
            Cursor nameCur = App.getInstance().getContentResolver()
                    .query(ContactsContract.Data.CONTENT_URI,
                            null,
                            ContactsContract.Data.MIMETYPE
                                    + " = ? AND "
                                    + StructuredName.CONTACT_ID
                                    + " = ?",
                            new String[] {
                                    StructuredName.CONTENT_ITEM_TYPE,
                                    Long.valueOf(id).toString() }, null);
            if (nameCur != null) {
                if (nameCur.moveToFirst()) {

                    String displayName = nameCur.getString(nameCur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                    if (displayName == null) displayName = "";

                    String firstName  = nameCur.getString(nameCur.getColumnIndex(StructuredName.GIVEN_NAME));
                    if (firstName == null) firstName = "";
                    Log.d("--> ", firstName.length()>0?firstName:displayName);

                    String middleName = nameCur.getString(nameCur.getColumnIndex(StructuredName.MIDDLE_NAME));
                    if (middleName == null) middleName = "";

                    String lastName = nameCur.getString(nameCur.getColumnIndex(StructuredName.FAMILY_NAME));
                    if (lastName == null) lastName = "";

                    lastName = middleName + (middleName.length()>0?" ":"") + lastName;

                    Log.d("--> ", lastName);
                }
                nameCur.close();
            }

            Bitmap photo = null;

            try {
                InputStream inputStream = ContactsContract.Contacts.openContactPhotoInputStream(App.getContext().getContentResolver(),
                        ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.valueOf(id)));

                if (inputStream != null) {
                    photo = BitmapFactory.decodeStream(inputStream);
                }

                if (inputStream != null) inputStream.close();

            } catch (IOException e) {
                e.printStackTrace();
            }

            Log.d("--> ", photo);
        }
    }

    if (cursor != null) { cursor.close(); }

You also needs this permission: <uses-permission android:name="android.permission.READ_CONTACTS" />

Hope that helps!

Asif Mujteba
  • 4,596
  • 2
  • 22
  • 38
0

This is the method am using to get contact photo, number and name but am dong this from a Fragment.

1 Set the permission in your manifest.

<uses-permission android:name="android.permission.READ_CONTACTS" />

2 Declare a constant:

private static final int REQUEST_CODE_PICK_CONTACT = 1;

3 In my app the user is required to choose a phone contact by clicking on a button. So in the onClick() method I do this:

contactChooserButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startActivityForResult(new Intent(Intent.ACTION_PICK,
          ContactsContract.Contacts.CONTENT_URI), REQUEST_CODE_PICK_CONTACT);

        }
    });

4 Add the methods to retrieve photo, name, and number:

private String retrieveContactNumber() {

    String contactNumber = null;

    // getting contacts ID
    Cursor cursorID = getActivity().getContentResolver().query(uriContact,
            new String[]{ContactsContract.Contacts._ID},
            null, null, null);

    if (cursorID.moveToFirst()) {

        contactID = cursorID.getString(cursorID.getColumnIndex(ContactsContract.Contacts._ID));
    }

    cursorID.close();

    Log.e(TAG, "Contact ID: " + contactID);

    // Using the contact ID now we will get contact phone number
    Cursor cursorPhone = getActivity().getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
            new String[]{ContactsContract.CommonDataKinds.Phone.NUMBER},

            ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ? AND " +
                    ContactsContract.CommonDataKinds.Phone.TYPE + " = " +
                    ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE,

            new String[]{contactID},
            null);

    if (cursorPhone.moveToFirst()) {
        contactNumber = cursorPhone.getString(cursorPhone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
        phoneNumber = contactNumber;
    }

    cursorPhone.close();

    Log.e(TAG, "Contact Phone Number: " + contactNumber);
    return contactNumber;

}

 //Retrieve name
 private void retrieveContactName() {

    String contactName = null;

    // querying contact data store
    Cursor cursor = getActivity().getContentResolver().query(uriContact, null, null, null, null);

    if (cursor.moveToFirst()) {

        // DISPLAY_NAME = The display name for the contact.
        // HAS_PHONE_NUMBER =   An indicator of whether this contact has at least one phone number.

        contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
        personName = contactName;
    }

    cursor.close();

    Log.e(TAG, "Contact Name: " + contactName);

}

//Retrieve photo (this method gets a large photo, for thumbnail follow the link below)
public void retrieveContactPhoto() {

    Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.parseLong(contactID));
    Uri displayPhotoUri = Uri.withAppendedPath(contactUri, ContactsContract.Contacts.Photo.DISPLAY_PHOTO);
    try {
        AssetFileDescriptor fd =
                getActivity().getContentResolver().openAssetFileDescriptor(displayPhotoUri, "r");
        photoAsBitmap = BitmapFactory.decodeStream(fd.createInputStream());

    } catch (IOException e) {
        e.printStackTrace();
    }
}

finally, in your onActivityForResult method, do this:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);        
    try {

        if(requestCode == REQUEST_CODE_PICK_CONTACT && resultCode == Activity.RESULT_OK) {
            Log.e(TAG, "Response: " + data.toString());
            uriContact = data.getData();
            personPhoneTextField.setText(retrieveContactNumber()); 
//the method retrieveContactNumber returns the contact number, 
//so am displaying this number in my EditText after getting it.
//Make your other methods return data of 
//their respective types (Bitmap for photo)

  retrieveContactPhoto();
  retrieveContactName();


        }
    } catch (Exception exception) {
        exception.printStackTrace();

    }
}

That's it.For Activities, take a look at this Android: Get Contact Details (ID, Name, Phone, Photo) on Github

Ojonugwa Jude Ochalifu
  • 26,627
  • 26
  • 120
  • 132