Как прочитать поле электронной почты из контакта в Android? - PullRequest
0 голосов
/ 26 декабря 2018

В моем приложении я читаю все контакты со своего телефона в виде списка.После нажатия на определенный вид из списка, я хочу прочитать имя, телефон и адрес электронной почты.Мне удается прочитать имя и телефон без проблем.Но я не могу получить электронное письмо.

Скажем, у меня есть 2 контакта:

Bill
55-555-555
bil@example.com

Mark
66-666-666
mark@example.com

Так что поле электронной почты называется обратным.Для Билла я получаю электронную почту Марка И для Марка я получаю электронную почту Билла.Остальные значения верны.

private  HashMap<String,String> getContactNames() 
{
        HashMap<String,String>contact=new HashMap<>();
        ContentResolver cr = getContentResolver();
        Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
        cursor.moveToPosition(pos_listView);
        String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

        Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
        phones.moveToPosition(pos_listView);
        String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

        Cursor emailcur = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, null,null, null);
        emailcur.moveToPosition(pos_listView);
        String email = emailcur.getString(emailcur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA1));

        contact.put("name",name);
        contact.put("phoneNumber",phoneNumber);
        contact.put("email",email);

        cursor.close();
        return contact;
    }

1 Ответ

0 голосов
/ 27 декабря 2018

Нет, это определенно не так, как работает.

В API ContactsContract есть 3 разные таблицы:

  1. Контакты
  2. RawContacts
  3. Данные (к которым вы можете получить доступ либо напрямую через Data.CONTENT_URI, либо через вспомогательные таблицы через Phone.CONTENT_URI, Email.CONTENT_URI и т. Д.)

Положение контакта в списке контактов не имеет никакого отношения к положению, если его телефон или электронные письма находятся в их таблицах, поэтому moveToPosition(pos_listView) очень неправильно.

Этоэто то, что вы должны сделать:

  1. При чтении списка всех контактов отслеживайте их идентификаторы контактов с помощью Contacts._ID и убедитесь, что вы можете получить его при нажатии на контакт
  2. При нажатии на контакт, получите его контактный идентификатор и отправьте его своему методу.
  3. В методе контактной информации запросите только один раз для всех телефонов и электронных писем (и, возможно, дополнительную информацию, если вам нужно).), чтобы получить их все сразу.

Ваш метод будет выглядеть примерно таке это:

private void getContactInfo(long contactId) {
    String[] projection = {Data.DISPLAY_NAME, Data.MIMETYPE, Data.DATA1};
    String selection = Data.CONTACT_ID + "=" + contactId + " AND " + Data.MIMETYPE + " IN ('" + Phone.CONTENT_ITEM_TYPE + "', '" + Email.CONTENT_ITEM_TYPE + "')";
    Cursor cur = cr.query(Data.CONTENT_URI, projection, selection, null, null);

    Log.i(TAG, "dumping info for contact id: " + contactId);
    while (cur.moveToNext()) {
        String name = cur.getString(0);
        String mime = cur.getString(1); // type of data: email, phone, company, etc.
        String data = cur.getString(2); // the actual info, e.g. +1-212-555-1234

        String type = Phone.CONTENT_ITEM_TYPE.equals(mime) ? "phone" : "email";

        Log.i(TAG, "info: " + name + " - " + type + ": " + data);
    }
    cur.close();
}
...