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

ng9*_*g93 36 android contacts google-contacts-api contactscontract

我正在尝试拨打联系人选择器,将人名,电话和电子邮件发送到字符串中,并使用意图将其发送到另一个活动.到目前为止,这工作:

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);  
        }  
    }  
}
Run Code Online (Sandbox Code Playgroud)

但如果我加入:

String number = c.getString(c.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
Run Code Online (Sandbox Code Playgroud)

它强行关闭

也许是获得他们号码的另一种方式?

Pen*_*m10 62

电话号码

电话号码存储在自己的表中,需要单独查询.要查询电话号码表,请使用存储在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();
    }
Run Code Online (Sandbox Code Playgroud)

对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();
Run Code Online (Sandbox Code Playgroud)

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

这里有更多教程

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

  • cr.query似乎不起作用.此外,String [] {id}中的id是什么......似乎无法找到这些变量中的任何一个. (7认同)
  • @eyal String phoneNumber = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); (3认同)