我的代码基于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
构造显然是错误的,但我不知道如何解决这个问题。
如何从我的个人资料联系人处获取以下详细信息:
答案 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