从0开始认识android(七):获取手机联系人的Intent

1、简单的获取联系人的电话号码或电子邮件地址或邮政地址

static final int REQUEST_SELECT_CONTACT = 1;
public void selectContact() {
//action为Intent.ACTION_PICK
        Intent intent = new Intent(Intent.ACTION_PICK);
        //从有电话号码的联系人中选取
        intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
        //从有电子邮件地址的联系人中选取
//        intent.setType(ContactsContract.CommonDataKinds.Email.CONTENT_TYPE);
        //从有邮政地址的联系人中选取。
//        intent.setType(ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_TYPE);
        if (intent.resolveActivity(getPackageManager()) != null) {
            startActivityForResult(intent, REQUEST_SELECT_CONTACT);
        }
    }

解析结果:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_SELECT_CONTACT&& resultCode == RESULT_OK) {
        // 目标联系人的Uri
        Uri contactUri = data.getData();
        String[] projection = new String[]{CommonDataKinds.Phone.NUMBER};
        Cursor cursor = getContentResolver().query(contactUri, projection,
                null, null, null); 
        // 
        if (cursor != null && cursor.moveToFirst()) {
            int numberIndex = cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER);
            //电话号码
            String number = cursor.getString(numberIndex);
        } 
    } 
} 

2、获取联系人头像Uri、名称等信息
打开手机联系人界面

static final int REQUEST_SELECT_CONTACT = 1;
public void selectContact() {
        Intent intent = new Intent(Intent.ACTION_PICK);
        //type为ContactsContract.Contacts.CONTENT_TYPE
        intent.setType(ContactsContract.Contacts.CONTENT_TYPE);
        if (intent.resolveActivity(getPackageManager()) != null) {
            startActivityForResult(intent, REQUEST_SELECT_CONTACT);
        }
    }

根据目标联系人的Uri获取该联系人的ContactsContract.Data.LOOKUP_KEY用于查询所需数据,这里借助系统的LoaderManager进行查询,以下为完整查询代码:

public class SecondActivity extends Activity implements LoaderManager
        .LoaderCallbacks<Cursor> {
    private static final String TAG = SecondActivity.class.getSimpleName();
    //定义查询的字段值,这里主要看联系人名称DISPLAY_NAME和头像资源的Uri--PHOTO_URI,当然,你也可以只列出你想要的字段,不必列出DATA1-DATA15
    private static final String[] PROJECTION =
            new String[]{
                    ContactsContract.Data._ID,
                    ContactsContract.Data.MIMETYPE,
                    ContactsContract.Data.DISPLAY_NAME,
                    ContactsContract.Data.PHOTO_URI,
                    ContactsContract.Data.DATA1,
                    ContactsContract.Data.DATA2,
                    ContactsContract.Data.DATA3,
                    ContactsContract.Data.DATA4,
                    ContactsContract.Data.DATA5,
                    ContactsContract.Data.DATA6,
                    ContactsContract.Data.DATA7,
                    ContactsContract.Data.DATA8,
                    ContactsContract.Data.DATA9,
                    ContactsContract.Data.DATA10,
                    ContactsContract.Data.DATA11,
                    ContactsContract.Data.DATA12,
                    ContactsContract.Data.DATA13,
                    ContactsContract.Data.DATA14,
                    ContactsContract.Data.DATA15
            };

    // 查询语句,这里根据联系人表中的LOOKUP_KEY来查询
    private static final String SELECTION = ContactsContract.Data.LOOKUP_KEY + " = ?";
    private String[] mSelectionArgs = {""};
    //查询的目标联系人的LOOKUP_KEY
    private String mLookupKey;
    //排序条件
    private static final String SORT_ORDER = ContactsContract.Data.MIMETYPE;
    // 此次查询操作的标识id,如果只有一个查询,没其他查询操作可以不用
    static final int DETAILS_QUERY_ID = 0;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        mLookupKey = getIntent().getStringExtra(ContactsContract.Contacts.LOOKUP_KEY);
        // 初始化系统的LoaderManager
        getLoaderManager().initLoader(DETAILS_QUERY_ID, null, this);
    }

    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        switch (id) {
            case DETAILS_QUERY_ID:
                mSelectionArgs[0] = mLookupKey;
                // 开始查询
                CursorLoader mLoader =
                        new CursorLoader(
                                SecondActivity.this,
                                ContactsContract.Data.CONTENT_URI,
                                PROJECTION,
                                SELECTION,
                                mSelectionArgs,
                                SORT_ORDER
                        );
                return mLoader;

            default:
                return null;
        }
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
        switch (loader.getId()) {
            case DETAILS_QUERY_ID:
                cursor.moveToFirst();
                int nameColumnIndex = cursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME);
                String name = cursor.getString(nameColumnIndex);
                Log.d(TAG, "联系人名称" + "======" + name);
                int photoColumnIndex = cursor.getColumnIndex(ContactsContract.Data.PHOTO_URI);
                String photoUri = cursor.getString(photoColumnIndex);
                Log.d(TAG, "联系人头像Uri" + "======" + photoUri);
                break;
        }
    }

    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
        switch (loader.getId()) {
            case DETAILS_QUERY_ID:
                /*
                 * 当前的loader被销毁时会回调这个方法,需要在这里释放掉对当前cursor的引用
                 *
                 */
                break;
        }
    }

}

选择的联系人
目标联系人的数据日志

猜你喜欢

转载自blog.csdn.net/jack_bear_csdn/article/details/80406904