【问题标题】:Loader for "Profile" contact's details“个人资料”联系人详细信息的加载程序
【发布时间】:2015-10-14 06:42:13
【问题描述】:

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

我需要继续使用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();
    }
}

我希望每个光标行都为我提供与个人资料联系人相关的完整数据集。相反,我从那个联系人那里得到了看似随机的字段。

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

如何从我的个人资料联系人那里获得以下详细信息:

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

【问题讨论】:

标签: android android-contacts contactscontract


【解决方案1】:

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

正在使用的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 相同。


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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    • 2020-05-08
    • 2012-02-21
    • 1970-01-01
    相关资源
    最近更新 更多