3

ContactsContractからメールアドレスを取得しようとしていますが、空の文字列しか取得できません。名前と番号は正常に機能していますが、メールアドレスは機能していません。

私は混乱して何日もこれを解決しようとしていますが、コードの何かを見逃したり、これを解決する方法がわからない場合は、何が問題なのかわかりません。

アプリケーションのこの部分には、ContactsContractからのすべての名前のListViewがあります。ListViewで名前を選択する場合、コードは、ContactsContractから名前、番号、および電子メールアドレスを取得する必要があります。

仕事を続けられるように助けていただければ幸いです。おそらくこれを解決するためのより良い方法があるので、変更する方法を教えてください!ありがとう!

トーストメッセージがwhileループ内に表示されないのでwhile(cursorEmail.moveToFirst()){....、メールカーソルに何か問題があると思います!?空っぽのようです!?

public class Activity_3 extends Activity {

ListView listView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_3);
    listView = (ListView) findViewById(R.id.contactList);

    String[] projection = { ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, 
            ContactsContract.CommonDataKinds.Phone.NUMBER,
            ContactsContract.CommonDataKinds.Phone._ID };

    Cursor cursor1 = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection, null, null, null);

    // From column
    String[] fromColumn = { ContactsContract.Contacts.DISPLAY_NAME };
    // To view
    int[] toView = { R.id.contactItem };

    startManagingCursor(cursor1);

    ListAdapter adapter = new SimpleCursorAdapter(this, R.layout.activity_3, cursor1, fromColumn, toView);

    listView.setAdapter(adapter);

    listView.setOnItemClickListener(new OnItemClickListener() {

        public void onItemClick(AdapterView<?> adapter, View view, int position, long id) {

            String[] projection = { ContactsContract.CommonDataKinds.Phone._ID, 
                    ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, 
                    ContactsContract.CommonDataKinds.Phone.NUMBER,
                    };

            Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection, null, null, null);

            cursor.moveToPosition(position);

            String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
            String contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
            String contactNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

            String pos = Integer.toString(position);

            String contactEmailAddress = "?";   
            //Email
            Cursor emails = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + "=" + contactId, null,  null);

            while(emails.moveToNext()){
                contactEmailAddress = emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
                Toast.makeText(Activity_3.this, contactEmailAddress, Toast.LENGTH_SHORT).show();
            }
            emails.close();

            Toast.makeText(Activity_3.this, pos + " " + contactId + " " + contactName + " " + contactNumber + " " + contactEmailAddress, Toast.LENGTH_SHORT).show();
        }
    });
}

}

4

5 に答える 5

11

次のコードで詳細が記載された連絡先リストを取得する必要があります。次のメソッドは、名前、電話番号、および電子メールを含むすべての連絡先を返します。

public ArrayList<ContactDO> getContacts()
{
    ArrayList<ContactDO> alContacts = null;
    Cursor cursor = contResv.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
    if(cursor.moveToFirst())
    {
        alContacts = new ArrayList<ContactDO>();
        do
        {
            //Create a plain class with following variables - id, name, contactNumber, email
            ContactDO objContactDO = new ContactDO();

            objContactDO.name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));       
            objContactDO.id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));

            Cursor emails = contResv.query(Email.CONTENT_URI,null,Email.CONTACT_ID + " = " + objContactDO.id, null, null);
            while (emails.moveToNext()) 
            { 
                objContactDO.email = emails.getString(emails.getColumnIndex(Email.DATA));
                break;
            }
            emails.close();

            if(Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0)
            {
                Cursor pCur = contResv.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",new String[]{ objContactDO.id }, null);
                while (pCur.moveToNext()) 
                {
                    objContactDO.contactNumber = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                    break;
                }
                pCur.close();
            }

            alContacts.add(objContactDO);

        } while (cursor.moveToNext()) ;
    } 

    cursor.close(); 
    return alContacts;
}

カスタムアダプタを作成し、listviewに設定します。

lvContacts.setAdapter(adapter = new CustomContactsAdapter(getContacts()));
于 2013-03-13T06:51:25.237 に答える
3

メールアドレスを取得しようとしている特定の連絡先のIDを持っていると仮定すると、これは、今と同じことをしようとしたときにしばらく前に作成したコードのスニペットです。

まず、連絡先のIDを取得する必要があります。

    ContentResolver cr  = context.getContentResolver();
    Cursor cursor       = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
    id                  = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));

次に、次のようにしてメールアドレスを取得できます。

            String contactAddress   = "";
            Cursor cursorEmail      = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,
                                            null, 
                                            ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?",
                                            new String[] {id}, 
                                            null);
            if(cursorEmail.moveToFirst()) {
                contactAddress = cursorEmail.getString(cursorEmail.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
            }

連絡先には必ずしもメールが含まれているとは限らないため、もちろんそれを考慮に入れる必要があります:-)

編集:コードをよく見て、ここに貼り付けたものと比較しました。あなたの問題はパラメータselectionとにあるようselectionArgsです。あなたがしたいことはあなたが電子メールアドレスを取得している連絡先のIDを取得し、次に選択を次のように変更することです:

ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?"

次のようにselectionArgsにIDを追加します。

new String[] {id}
于 2013-03-06T09:26:17.633 に答える
0

ここでは、メールIDまたは連絡先IDでnull(使用できない場合)を返す作業メソッドを投稿しています。

public static String getEmail(Context c, long id) {
        Uri uri = ContactsContract.CommonDataKinds.Email.CONTENT_URI;
        String[] projection = new String[] {
                ContactsContract.CommonDataKinds.Email._ID,
                ContactsContract.CommonDataKinds.Email.CONTACT_ID,
                ContactsContract.CommonDataKinds.Email.ADDRESS,
                ContactsContract.CommonDataKinds.Email.TYPE };
        String selection = ContactsContract.CommonDataKinds.Email.CONTACT_ID
                + " = '" + id + "'";
        String sortOrder = ContactsContract.CommonDataKinds.Email.ADDRESS
                + " COLLATE LOCALIZED ASC";

        Cursor cursor = c.getContentResolver().query(uri, projection,
                selection, null, sortOrder);

        int index = cursor
                .getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS);
        if (cursor.moveToNext()) {
            return cursor.getString(index);
        }
        return null;
    }
于 2013-03-14T13:17:09.130 に答える
0
ContentResolver cr = this.getContext().getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null);
if (cur.getCount() > 0) {
    while (cur.moveToNext()) {
        String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
        Cursor cur1 = cr.query( 
                ContactsContract.CommonDataKinds.Email.CONTENT_URI, null,
                ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", 
                        new String[]{id}, null); 
        while (cur1.moveToNext()) { 
            //to get the contact names
            String name=cur1.getString(cur1.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
            String email = cur1.getString(cur1.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));



        } 
        cur1.close();
    }
}
于 2013-03-15T11:22:25.687 に答える
0

これを使って

String email = "";  
            try {  
                Uri result = data.getData();  
                Log.v(DEBUG_TAG, "Got a contact result: "  
                        + result.toString());  
                // get the contact id from the Uri  
                String id = result.getLastPathSegment();  
                // query for everything email  
                cursor = getContentResolver().query(Email.CONTENT_URI,  
                        null, Email.CONTACT_ID + "=?", new String[] { id },  
                        null);  
                int emailIdx = cursor.getColumnIndex(Email.DATA);  
                // let's just get the first email  
                if (cursor.moveToFirst()) {  
                    email = cursor.getString(emailIdx);  
                    Log.v(DEBUG_TAG, "Got email: " + email);  
                } else {  
                    Log.w(DEBUG_TAG, "No results");  
                }  
            } catch (Exception e) {  
                Log.e(DEBUG_TAG, "Failed to get email data", e);  
            } finally {  
                if (cursor != null) {  
                    cursor.close();  
                } 

               edtCustomerEmailid.setText(email);

              //Toast.makeText(getApplicationContext(), email, 1).show();
                if (email.length() == 0) {  
                    Toast.makeText(this, "No email found for contact.",  
                            Toast.LENGTH_LONG).show();  
                }  
            } 
于 2013-03-15T13:41:15.457 に答える