0

ユーザーは連絡先から連絡先を選択します。これがコールバック関数です (onActivityResult(...)コードをスキップしていますが、正常に動作しています)。

private User addUserFromContactData(Intent data) {
    Uri contactData = data.getData();

    // Cursor loader to query contact information
    CursorLoader cl = new CursorLoader(this);
    String[] projection = { ContactsContract.Contacts.DISPLAY_NAME,
        ContactsContract.CommonDataKinds.Email.DATA };
    cl.setProjection(projection);
    cl.setUri(ContactsContract.CommonDataKinds.Email.CONTENT_URI);
    cl.setSelection(ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?");
    cl.setSelectionArgs(new String[] { contactData.getLastPathSegment() });

    // Execute query and get results from cursor
    Cursor c = cl.loadInBackground();
    final int nameIndex = c.getColumnIndex(projection[0]);
    final int emailIndex = c.getColumnIndex(projection[1]);

    User user = null;
    if (c.moveToFirst()) {
        user = new User();
        user.setName(c.getString(nameIndex));
        user.setEmail(c.getString(emailIndex));
    }

    c.close();
    return user;
}

この方法は、電子メール アドレスを持つ連絡先では問題なく機能します。しかし、それなしで連絡先を選択すると、結果が見つかりません。電子メールは私にとってオプションなので、電子メールがない場合は、連絡先の名前のみを使用します. メールアドレスのある連絡先のみを選択しているようです。

誰でも私を助けることができますか?1 回目は名前を取得し、2 回目はオプションの電子メールを取得するために、2 回クエリを実行する必要があるのでしょうか。

みんなありがとう。

4

1 に答える 1

2

解決しました。これを実現するには、2つのクエリが必要です(1つだけで同じことができる場合は、修正してください)。

private User addUserFromContactData(Intent data) {
    Uri contactData = data.getData();

    // Cursor loader to query contact name
    CursorLoader clName = new CursorLoader(this);
    clName.setProjection(new String[] { ContactsContract.Contacts.DISPLAY_NAME });
    clName.setUri(ContactsContract.Contacts.CONTENT_URI);
    clName.setSelection(ContactsContract.Contacts._ID + " = ?");
    clName.setSelectionArgs(new String[] { contactData.getLastPathSegment() });

    // Cursor loader to query optional contact email
    CursorLoader clEmail = new CursorLoader(this);
    clEmail.setProjection(new String[] { ContactsContract.CommonDataKinds.Email.DATA });
    clEmail.setUri(ContactsContract.CommonDataKinds.Email.CONTENT_URI);
    clEmail.setSelection(ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?");
    clEmail.setSelectionArgs(new String[] { contactData.getLastPathSegment() });

    // Execute queries and get results from cursors
    Cursor cName = clName.loadInBackground();
    Cursor cEmail = clEmail.loadInBackground();
    final int nameIndex = cName.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
    final int emailIndex = cEmail.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA);

    User user = null;
    if (cName.moveToFirst()) {
        user = new User();
        user.setName(cName.getString(nameIndex));
    }

    // This only could be true if selected contact has at least one email
    if (cEmail.moveToFirst() && user != null) {
        user.setEmail(cEmail.getString(emailIndex));
    }

    cName.close();
    cEmail.close();
    return user;
}

手がかり@Luksprogをありがとう!CursorLoader以前のコードでは、 'sUriがだったので、メールで連絡先にクエリを実行するだけでしたContactsContract.CommonDataKinds.Email.CONTENT_URI

于 2012-09-28T16:55:08.110 に答える