在安卓系统中提取联系人信息时得到错误的数据。

问题描述 投票:0回答:1

我试图从一个选定的联系人中获取详细信息,并将其反馈给我的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();
            }
        });
    }
android rx-java android-contacts android-contentresolver database-cursor
1个回答
0
投票

每一行的 ContactsContract.Data 包含一个MIMETYPE,这意味着这整条记录包含了什么 "类型 "的数据,所以如果Data.MIMETYPE = Phone.CONTENT_ITEM_TYPE意味着整条记录存储了一个电话号码。

你试图从一条记录中提取StructuredName、Organization、Email、StructuredPostal等数据,这就解释了你得到的垃圾数据。

请看这里的代码示例,了解如何使用MIMETYPE值从游标上提取联系人信息。ContactsContract.Data:https:/stackoverflow.coma46594049819355。

© www.soinside.com 2019 - 2024. All rights reserved.