0

私はその名前で連絡のための電子メールを取得しようとしてきましたが、いくつかの困難に立ち往生しています。これが私がこれをやろうとしている方法です:

    Cursor emailCur = cr.query(
            ContactsContract.CommonDataKinds.Email.CONTENT_URI, null,
            ContactsContract.CommonDataKinds.Email.DISPLAY_NAME + " = ?",
            new String[] { contactName }, null);
    while (emailCur.moveToNext()) {
        String email = emailCur
                .getString(emailCur
                        .getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
        String emailType = emailCur
                .getString(emailCur
                        .getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));
                }
    emailCur.close();

常に例外が発生しますが、何が間違っているのでしょうか。

これで、カーソルループの反復がゼロになります。

4

3 に答える 3

2

電子メールアドレスのクエリは、電話番号に似ています。データベースから電子メールアドレスを取得するには、クエリを実行する必要があります。メールアドレステーブルをクエリするには、ContactsContract.CommonDataKinds.Email.CONTENT_URIに保存されているURIをクエリします。

 Cursor emailCur = cr.query( 
    ContactsContract.CommonDataKinds.Email.CONTENT_URI, 
    null,
    ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", 
    new String[]{id}, null); 
while (emailCur.moveToNext()) { 
    // This would allow you get several email addresses
        // if the email addresses were stored in an array
    String email = emailCur.getString(
                  emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
    String emailType = emailCur.getString(
                  emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE)); 
} 
emailCur.close();

電話クエリと同様に、電子メールテーブルのフィールド名もContactsContract.CommonDataKindsに保存されます。電子メールクエリはContactsContract.CommonDataKinds.Email.CONTENT_URIのURIで実行され、WHERE句はContactsContract.CommonDataKinds.Email.CONTACT_IDフィールドと一致する必要があります。複数の電子メールアドレスを保存できるため、カーソルで返されたレコードをループします。

ここに他のチュートリアル

于 2012-05-10T18:02:23.627 に答える
0

while(...) ループを呼び出す前に、 emailCur.moveToFirst() を呼び出す必要があると思います。

あなたがうまくいくかどうかはわかりませんが、私はいつもカーソルループを次のように構成しています:

while(!emailCur.isAfterLast())
{
    //Do stuff with cursor

    emailCur.moveToNext();
}

編集: また、表示名で連絡先の電子メールを検索していると言うとき、連絡先の名前 (John Smith など) を意味するのでしょうか、それとも電子メール アドレスの表示名を意味するのでしょうか? 上記のループでは、後者を実行しています。

編集 #2: すべての連絡先のメール アドレス (および電話番号と住所) を取得する方法に関するチュートリアルです。最初の部分が指定した表示名の連絡先のみを返すように、少し変更する必要があります。連絡先の _ID に基づいてメール アドレスを返す部分は、まだ実行する必要があります。

http://www.higherpass.com/Android/Tutorials/Working-With-Android-Contacts/

渡された表示名に一致する連絡先の ID のみを取得するための変更は、最初に投稿したものと非常によく似ていますが、照会する URI と、表示名を照合するデータ型が異なります ( : ContactsContract.Contacts.DISPLAY_NAME) になります。

于 2012-05-10T16:28:29.070 に答える