android - 从 android 联系人选择器获取联系人信息

标签 android contacts contactscontract google-contacts-api

我正在尝试调用联系人选择器,将人员姓名、电话和电子邮件转换为字符串,然后使用 Intent 将它们发送到另一个 Activity 。到目前为止,这是可行的:

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

但如果我添加:

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

强制关闭

也许还有其他方法可以获取他们的电话号码?

最佳答案

电话号码

电话号码存储在自己的表中,需要单独查询。要查询电话号码表,请使用存储在 SDK 变量 ContactsContract.CommonDataKinds.Phone.CONTENT_URI 中的 URI。使用 WHERE 条件获取指定联系人的电话号码。

    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();
    }

对 Android 联系人 SQLite 数据库执行第二次查询。根据存储在 ContactsContract.CommonDataKinds.Phone.CONTENT_URI 中的 URI 查询电话号码。联系人 ID 作为 ContactsContract.CommonDataKinds.Phone.CONTACT_ID 存储在电话表中,WHERE 子句用于限制返回的数据。

电子邮件地址

查询电子邮件地址类似于电话号码。必须执行查询才能从数据库中获取电子邮件地址。查询存储在 ContactsContract.CommonDataKinds.Email.CONTENT_URI 中的 URI 以查询电子邮件地址表。

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();

与电话查询一样,电子邮件表的字段名称也存储在 ContactsContract.CommonDataKinds 下。电子邮件查询是在 ContactsContract.CommonDataKinds.Email.CONTENT_URI 中的 URI 上执行的,并且 WHERE 子句必须与 ContactsContract.CommonDataKinds.Email.CONTACT_ID 字段匹配。由于可以通过光标中返回的记录循环存储多个电子邮件地址。

更多教程here

此方法需要 Android API 5 或更高版本。

关于android - 从 android 联系人选择器获取联系人信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3044545/

相关文章:

android - 如何唯一标识 ContactsContract.Contacts 表上的联系人

android - 如何让其他应用程序知道要查找的 CONTENT_URI?

java - Android 中的图像选择出现 OutOfMemoryError。如何在将图像解码为位图之前调整图像大小?

gmail - 如何检查电子邮件地址是否属于 Gmail

android从html文本创建pdf文件

socialauth 的 Android 实现

android - 将缓存图像设置为联系人照片

Android 如何检测联系人列表已更改?

android - Android Lollipop 中的通知背景是白色的。我怎样才能改变它?

Android 在 Recyclerview 中使用 itemTouchHelper 在cardview上拖动海拔翻译z