从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;
        }
    }

}

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

  3、获取所有联系人信息

public static List<ContactInfo> readContactInfo(Context context) {

        Uri contactUri = Uri.parse("content://com.android.contacts/raw_contacts");
        Uri datatUri = Uri.parse("content://com.android.contacts/data");
        ContentResolver resolver = context.getContentResolver();

        Cursor cursor = resolver.query(contactUri, new String[]{"contact_id"}, null, null, null);

        List<ContactInfo> list  = new ArrayList<ContactInfo>();
        while(cursor.moveToNext()){

            String id = cursor.getString(0);
            System.out.println("id : " + id );

            // 要准备 一个ContactInfo类的实例, 去封装 数据了
            ContactInfo info = new ContactInfo();

            Cursor dataCursor = resolver.query(datatUri, new String[]{"data1","mimetype"}, "raw_contact_id=?", new String[]{id}, null);

            while(dataCursor.moveToNext()){

                String data = dataCursor.getString(0);
                String type = dataCursor.getString(1);

                if("vnd.android.cursor.item/email_v2".equals(type)){

                    info.setEmail(data);

                }else if("vnd.android.cursor.item/im".equals(type)){

                    info.setIm(data);
                }else if("vnd.android.cursor.item/name".equals(type)){

                    info.setName(data);
                }else if("vnd.android.cursor.item/phone_v2".equals(type)){

                    info.setPhone(data);
                }else if("vnd.android.cursor.item/photo".equals(type)){

                    info.setPhoto(data);
                }

            }
            dataCursor.close();
            //将联系人 添加到 list 中去

            list.add(info);

            System.out.println("========");
        }

        cursor.close();

        return list;
    }
public class ContactInfo {

    private String name;   //
    private String phone;   //
    private String email;   //
    private String photo;   //
    private String status;
    private String im;    // 即时通讯号
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }

    public String getPhoto() {
        return photo;
    }

    public void setPhoto(String photo) {
        this.photo = photo;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getIm() {
        return im;
    }
    public void setIm(String im) {
        this.im = im;
    }
    @Override
    public String toString() {
        return "ContactInfo [name=" + name + ", phone=" + phone + ", email="
                + email + ", im=" + im + "]"+",photo="+photo;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值