装载“配置文件”联系人的详细信息

时间:2015-10-14 06:42:13

标签: android android-contacts contactscontract

我的代码基于Android Studio提供的Login示例。该示例包含使用与设备的AutoCompleteTextView联系人相关的电子邮件地址填充ContactsContract.Profile的代码。即电话的所有者,我。

我需要继续使用LoaderCallbacks接口方法 - onCreateLoader()onLoaderFinished()

我想在联系人上获取额外的详细信息,如:

  • 电话号码
  • 名字命名
  • 姓氏

为实现这一目标,我尝试在示例中定义的ProfileQuery接口中添加额外的字段(可以正常获取电子邮件地址):

private interface ProfileQuery {
    String[] PROJECTION = {
            // these fields as per Android Studio sample
            ContactsContract.CommonDataKinds.Email.ADDRESS,
            ContactsContract.CommonDataKinds.Email.IS_PRIMARY,

            // these fields added by me
            ContactsContract.CommonDataKinds.Phone.NUMBER,
            ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME,
            ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME
    };
}

我修改了onCreateLoader()方法以删除样本的WHERE子句,希望获得额外的数据:

public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
    return new CursorLoader(this,
            // Retrieve data rows for the device user's 'profile' contact.
            Uri.withAppendedPath(ContactsContract.Profile.CONTENT_URI,
                    ContactsContract.Contacts.Data.CONTENT_DIRECTORY), ProfileQuery.PROJECTION,

            // select all fields
            null, null,

            // Show primary email addresses first. Note that there won't be
            // a primary email address if the user hasn't specified one.
            ContactsContract.Contacts.Data.IS_PRIMARY + " DESC");
}

对于它的价值,目前我的onLoadFinished()只记录收到的数据:

public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
    cursor.moveToFirst();
    while (!cursor.isAfterLast()) {
        Log.d("xxx", cursor.getString(0) + cursor.getString(1) + cursor.getString(2) + cursor.getString(3) + cursor.getString(4));
        cursor.moveToNext();
    }
}

我希望每个光标行都能给我一套与Profile联系人相关的完整数据。相反,我从该联系人那里得到看似随机的字段。

我的CursorLoader构造显然是错误的,但我不知道如何解决这个问题。

如何从我的个人资料联系人处获取以下详细信息:

  • 电子邮件地址
  • 电话号码
  • 名字命名
  • 姓氏?

1 个答案:

答案 0 :(得分:0)

上述代码基于对联系人数据存储方式的误解。

正在使用的Uri指向ContactsContract.Data表。 Developer docs解释了该表的结构。表中的每一行都是一个信息项,而不是一个联系人。例如电子邮件地址,电话号码等。

定义的投影特定于电子邮件地址(因为样本仅处理电子邮件)。可以处理不同数据类型的更一般的投影可能类似于:

private interface ProfileQuery {
    String[] PROJECTION = {
            ContactsContract.Data.MIMETYPE,
            ContactsContract.Data.DATA1,
            ContactsContract.Data.DATA2,
            ContactsContract.Data.DATA3,
    };
}

正如文档所解释的那样:

  

DATA1是一个索引列,应该用于数据元素   预计最常用于查询选择。对于   例如,在表示电子邮件地址DATA1的行的情况下   应该可以用于电子邮件地址本身,而DATA2等   可用于辅助信息,如电子邮件地址类型。

  

例如,   Phone.NUMBER与Data.DATA1相同。

然后,查询返回Profile联系人中每条信息的光标行。就我而言,我存储的3个电子邮件地址,电话号码和我的名字。

对于每一行,Data.MIMETYPE列定义应如何读取其他数据列。可以根据ContactsContract.CommonDataKinds类中声明的常量查询mimetypes,例如:

  • Email.CONTENT_ITEM_TYPE
  • Phone.CONTENT_ITEM_TYPE
  • StructuredName.CONTENT_ITEM_TYPE
  • Organization.CONTENT_ITEM_TYPE