0

プロファイルからユーザーの情報 (名、姓、電話番号、電子メールなど) を取得しようとしています。以下は私のコードです。奇妙なことに、いくつかのレコードがあり(cursor.moveToNext()数回動作します)、そのうちの1つは電話の値に電子メールが含まれ、もう1つは電子メールフィールドに住所が含まれています。必要なのは、ピースを選んで組み合わせるのではなく、1 つの正しいレコードだけです。

必要な権限を追加するので、問題はないはずです。

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.READ_PROFILE" />

ヒントはありますか?ありがとう

以下は私のコードです

private static final String[] PERSONAL_ADDRESS_PROJ = {
            ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME,
            ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME,
            ContactsContract.CommonDataKinds.Phone.NUMBER,
            ContactsContract.CommonDataKinds.Email.ADDRESS,

    };

    private static final int INDEX_GIVEN_NAME = 0;
    private static final int INDEX_FAMILY_NAME = INDEX_GIVEN_NAME + 1;
    private static final int INDEX_PHONE_NUMBER = INDEX_FAMILY_NAME + 1;
    private static final int INDEX_EMAIL = INDEX_PHONE_NUMBER + 1;

private SignupModel searchForProfile() {


        final Uri uri = Uri.withAppendedPath(ContactsContract.Profile.CONTENT_URI,
                ContactsContract.Contacts.Data.CONTENT_DIRECTORY);

        String selection = ContactsContract.Contacts.Data.MIMETYPE + " = ?" + " OR " +
                ContactsContract.Contacts.Data.MIMETYPE + " = ?" + " OR " +
                ContactsContract.Contacts.Data.MIMETYPE + " = ?" ;

        String [] args =  new String[]{ ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE,
                        ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE,
                        ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE};

        Cursor cursor = mContext.getContentResolver().query(uri, PERSONAL_ADDRESS_PROJ, selection, args, null);
        SignupModel model;

        if (cursor != null && cursor.moveToFirst()) {
            try {
                do
                {
                    final String givenName = cursor.getString(INDEX_GIVEN_NAME);
                    final String familyName = cursor.getString(INDEX_FAMILY_NAME);
                    final String phone = cursor.getString(INDEX_PHONE_NUMBER);
                    final String email = cursor.getString(INDEX_EMAIL);

                    model = new SignupModel(email,null,null,givenName, familyName, phone,null);

                }while (cursor.moveToNext()); //loop for debugging purpose

            } catch (Exception e) {
                model = null;
            } finally {
                cursor.close();
            }

        } else {
            LogUtils.LOGD(TAG, "Couldn't find profile entry");
            model = null;
        }
        return model;
    }
4

1 に答える 1

0

すべての情報が MIMETYPE に従って個別の項目として保存されるため、1 つのレコードですべての情報を取得することはできません。カーソルを読み取るときは、最初にカーソルから MIMETYPE を読み取り、次に対応する列からデータを読み取る必要があります。

選択で 3 つの MIME タイプを指定したことを説明すると、ユーザーがすべての情報を入力した場合、少なくとも 3 つのレコードが取得されます。name については、DISPLAY_NAME、GIVEN_NAME、FAMILY_NAME などを含む 1 つのレコードが取得されます。また、1 つ取得されます。彼が追加した番号の数を考慮すると、各レコードにはタイプ (MOBILE、HOME など) も含まれます。EMAIL についても同様です。

名前の列については、このリンクを参照してください 。 電話と電子メールは DATA1 列に保存されます。

電話

Eメール

于 2015-09-07T10:59:11.917 に答える