我正在尝试 call 联系人选择器,将人员姓名,电话和电子邮件输入字符串,然后使用意图将其发送到其他 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或更高版本。

07-26 09:36