从 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 上的游标 运行 中提取联系人信息的代码示例,请参见此处: