我试图从一个选定的联系人中获取详细信息,并将其反馈给我的Fragment中的Observable。我得到了一些数据,但并不正确,例如,我只得到 "1 "或 "3 "作为给定的名字和出生日期作为urlwebsite。有些数据根本没有被检索到,比如任何与邮政地址相关的数据(街道、邮编、城市等)。
我哪里出错了?
public Observable<Contact> getContact(ContentResolver contentResolver, Uri uri) {
return Observable.create(emitter -> {
Cursor contactCursor = null;
Cursor detailedCursor = null;
String firstName = "",
lastName = "",
organization = "",
email = "",
phone = "",
cell = "",
street = "",
postcode = "",
city = "",
region = "",
country = "",
url = "";
try {
contactCursor = contentResolver.query(
uri,
new String[] { ContactsContract.Data.LOOKUP_KEY },
null,
null,
null);
if (contactCursor != null && contactCursor.getCount() > 0 && contactCursor.moveToNext()) {
String lookupKey = contactCursor.getString(contactCursor.getColumnIndex(
ContactsContract.Data.LOOKUP_KEY));
final String[] projection =
{
StructuredName.GIVEN_NAME,
StructuredName.FAMILY_NAME,
Organization.COMPANY,
Email.ADDRESS,
Phone.NUMBER,
StructuredPostal.STREET,
StructuredPostal.POSTCODE,
StructuredPostal.CITY,
StructuredPostal.REGION,
StructuredPostal.COUNTRY,
Website.URL
};
String selection = ContactsContract.Data.LOOKUP_KEY + " = ?";
String sortOrder = ContactsContract.Data.MIMETYPE;
detailedCursor = contentResolver.query(
ContactsContract.Data.CONTENT_URI,
projection,
selection,
new String[] { lookupKey },
sortOrder);
if(detailedCursor != null && detailedCursor.getCount() > 0 && detailedCursor.moveToNext()) {
Log.d(TAG, "detailedCursor Columns: " + Arrays.toString(detailedCursor.getColumnNames()));
firstName = detailedCursor.getString(detailedCursor.getColumnIndex(
StructuredName.GIVEN_NAME));
lastName = detailedCursor.getString(detailedCursor.getColumnIndex(
StructuredName.FAMILY_NAME));
organization = detailedCursor.getString(detailedCursor.getColumnIndex(
Organization.COMPANY));
email = detailedCursor.getString(detailedCursor.getColumnIndex(
Email.ADDRESS));
street = detailedCursor.getString(detailedCursor.getColumnIndex(
StructuredPostal.STREET));
postcode = detailedCursor.getString(detailedCursor.getColumnIndex(
StructuredPostal.POSTCODE));
city = detailedCursor.getString(detailedCursor.getColumnIndex(
StructuredPostal.CITY));
region = detailedCursor.getString(detailedCursor.getColumnIndex(
StructuredPostal.REGION));
country = detailedCursor.getString(detailedCursor.getColumnIndex(
StructuredPostal.COUNTRY));
url = detailedCursor.getString(detailedCursor.getColumnIndex(
Website.URL));
}
}
} catch (Exception e) {
Log.e(TAG, "Couldn't retrieve columns", e);
} finally {
if (contactCursor != null) {
contactCursor.close();
}
if (detailedCursor != null) {
detailedCursor.close();
}
emitter.onNext(new Contact(firstName, lastName, organization, email, phone,
cell, street, postcode, city, region, country, url));
emitter.onComplete();
}
});
}
每一行的 ContactsContract.Data
包含一个MIMETYPE,这意味着这整条记录包含了什么 "类型 "的数据,所以如果Data.MIMETYPE = Phone.CONTENT_ITEM_TYPE意味着整条记录存储了一个电话号码。
你试图从一条记录中提取StructuredName、Organization、Email、StructuredPostal等数据,这就解释了你得到的垃圾数据。
请看这里的代码示例,了解如何使用MIMETYPE值从游标上提取联系人信息。ContactsContract.Data
:https:/stackoverflow.coma46594049819355。