从 Android 中的联系人中提取详细信息时获取错误数据
Getting wrong data when extracting details from contact in Android
我正在尝试从选定的联系人获取详细信息并将其反馈到 Observable 中的我的 Fragment。我得到了一些数据,但它不正确,例如,我只得到一个“1”或“3”作为给定的名字和出生日期 url/website。有些数据根本没有检索到,例如任何 post 地址相关(街道、post代码、城市等)
我哪里做错了?
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,这意味着整行的 "type" 数据包含什么,所以如果 Data.MIMETYPE = Phone.CONTENT_ITEM_TYPE 这意味着整行存储一个 phone 数字。
您正在尝试从一行中提取 StructuredName、Organization、Email、StructuredPostal 等,这解释了您返回的垃圾。
有关如何使用 MIMETYPE 值从 ContactsContract.Data
上的游标 运行 中提取联系人信息的代码示例,请参见此处:
我正在尝试从选定的联系人获取详细信息并将其反馈到 Observable 中的我的 Fragment。我得到了一些数据,但它不正确,例如,我只得到一个“1”或“3”作为给定的名字和出生日期 url/website。有些数据根本没有检索到,例如任何 post 地址相关(街道、post代码、城市等)
我哪里做错了?
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,这意味着整行的 "type" 数据包含什么,所以如果 Data.MIMETYPE = Phone.CONTENT_ITEM_TYPE 这意味着整行存储一个 phone 数字。
您正在尝试从一行中提取 StructuredName、Organization、Email、StructuredPostal 等,这解释了您返回的垃圾。
有关如何使用 MIMETYPE 值从 ContactsContract.Data
上的游标 运行 中提取联系人信息的代码示例,请参见此处: