2012-05-10 13 views
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(); 

私は常に例外を取得し、:ここ は、私はこれを行うにしようとしていますどのようにでしょうか?

私はカーソルループをゼロ回繰り返しています。

+0

をごlogcatエラーを投稿し、私たちはその例外と理由を知ってください。 – Sam

答えて

2

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

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

詳しいチュートリアルhere

+0

私はidの代わりに表示名を使って同様のものをやろうとしましたが失敗しました。表示名で電子メールを受け取る必要があります –

+1

私は同様の問題がありました。電子メールテーブルのように、空の表示名が常にあるようです。誰もが同様の問題を抱えていた? – rycfung

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になります)。

+0

カーソルが最後の行を通過すると、moveToNext()はfalseを返します。元のループは意図したとおりに動作します。また、あなたはmoveToFirst()を使っていません... while(emailCur.moveToNext()) 'は正確な略記です。 – Sam

+0

ああ、意味がある。 – Gophermofur

+0

私は連絡先の名前について話しています。 –

0

は、名前からメールでお知らせします::

public String getEmail(String name, Context context){ 

    String email = null; 
    String selection = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " like'%" + 
      name + "%'"; 
    final String[] projection = new String[]{Email.DATA, // use 
      // Email.ADDRESS 
      // for API-Level 
      // 11+ 
      Email.TYPE}; 
    Cursor c = context.getContentResolver().query 
      (Email.CONTENT_URI, 
        projection, selection, null, null); 
    if (c != null && c.moveToFirst()) { 
     email = c.getString(0); 
     c.close(); 
    } 
    if (email == null) 
     email = "Unsaved"; 

    Log.d(TAG, "email: " + email); 
    return email; 
} 
+0

いくつかのアイテムがコードブロックにないようです。 –

関連する問題