Home

Awesome

Unified Contact Picker Android Library

GitHub release Min SDK GitHub license Android Arsenal

Introduction

This library unifies the user contacts in a compact and user intuitive way allowing the end-user to choose between the contact's available communication options (email/phone number) follows Material Design guidelines.

Although there is a standard way to call the contact list in Android, it does not always feel well-integrated in your app Android applications. UnifiedContactPicker is an Android library which allows you to easily integrate contact picking workflow into your application with minimal effort

IMPORTANT :exclamation:


This library is no longer in active development. However, pull requests for new features or bugfixes are always welcomed and will be attended.

Demo

Features

Installation

In order to use the library, add the following line to your root gradle file:

<pre> <code> repositories { jcenter() maven { url "https://jitpack.io" } ... } </code> </pre>

As well as this line in your project build.gradle file

<pre> <code> dependencies { compile 'com.github.quiin:unifiedContactPicker:{LATEST_VERSION}' ... } </code> </pre>

Usage

To use UnifiedContactPicker in your app simply follow this 3 simple steps:

  1. Add read contacts permission in your manifest
    <uses-permission android:name="android.permission.READ_CONTACTS"/>
  1. Launch ContactPickerActivity.java as activity result
// Your Activity or Fragment
public void launchContactPicker(View view) {
        int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS);
        if(permissionCheck == PackageManager.PERMISSION_GRANTED){
            Intent contactPicker = new Intent(this, ContactPickerActivity.class);
            startActivityForResult(contactPicker, CONTACT_PICKER_REQUEST);
        }else{
            ActivityCompat.requestPermissions(this,
                    new String[] {Manifest.permission.READ_CONTACTS},
                    READ_CONTACT_REQUEST);
        }
    }

  1. Override onActivityResult() and wait for the user to select the contacts.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode){
        case CONTACT_PICKER_REQUEST:
            if(resultCode == RESULT_OK){
                TreeSet<SimpleContact> selectedContacts = (TreeSet<SimpleContact>)data.getSerializableExtra(ContactPickerActivity.CP_SELECTED_CONTACTS);
                for (SimpleContact selectedContact : selectedContacts)
                        Log.e("Selected", selectedContact.toString());
            }else
                Toast.makeText(this, "No contacts selected", Toast.LENGTH_LONG).show();
        break;
        default:
            super.onActivityResult(requestCode,resultCode,data);
        }
}

Contacts are returned in a TreeSet of SimpleContact; each SimpleContact object ha the following accessible properties:

:warning: IMPORTANT

As of SDK 23 (Android 6) developers are requested to explicitly ask for permissions at runtime. So please be sure to request for contact reading permissions using the previous code or any other means you prefer.

Customization

The following UI views can be customized:

UI componentIntent extraExpected valueTypeSugestion
FAB colorCP_EXTRA_FAB_COLORhexColorString-
Selection colorCP_EXTRA_SELECTION_COLORhexColorString-
Selection DrawableCP_EXTRA_SELECTION_DRAWABLEImagebyte []use PickerUtils.sendDrawable()
Fab drawableCP_EXTRA_FAB_DRAWABLEImagebyte []use PickerUtils.sendDrawable()
ChipsCP_EXTRA_SHOW_CHIPSbooleanboolean-

Aditionally, you can customize the contact query parameters used to extract the user's contacts adding the following extras to the intent

ExtraType
CP_EXTRA_PROJECTIONString []
CP_EXTRA_SELECTIONString
CP_EXTRA_SELECTION_ARGSString []
CP_EXTRA_HAS_CUSTOM_SELECTION_ARGSboolean
CP_EXTRA_SORT_BYString

Example

public void launchContactPicker(View view) {
        int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS);
        if(permissionCheck == PackageManager.PERMISSION_GRANTED){
            Intent contactPicker = new Intent(this, ContactPickerActivity.class);
            //Don't show Chips
            contactPicker.putExtra(ContactPickerActivity.CP_EXTRA_SHOW_CHIPS, false);
            //Customize Floating action button color
            contactPicker.putExtra(ContactPickerActivity.CP_EXTRA_FAB_COLOR, "#FFF722");
            //Customize Selection drawable
            contactPicker.putExtra(ContactPickerActivity.CP_EXTRA_SELECTION_DRAWABLE, PickerUtils.sendDrawable(getResources(),R.drawable.my_drawable));
            startActivityForResult(contactPicker, CONTACT_PICKER_REQUEST);
        }else{
            ActivityCompat.requestPermissions(this,
                    new String[] {Manifest.permission.READ_CONTACTS},
                    READ_CONTACT_REQUEST);
        }
    }

Default values & behavior

"(" + ContactsContract.Data.MIMETYPE + "=? OR " + ContactsContract.Data.MIMETYPE + "=?)"

Considerations

Support & extension

Acknowledgments