Подтвердить что ты не робот

Получить контактную информацию от android contact picker

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

Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);  
startActivityForResult(intent, 1);  

// ...

@Override  
public void onActivityResult(int reqCode, int resultCode, Intent data) {  
    super.onActivityResult(reqCode, resultCode, data);  
    if (resultCode == Activity.RESULT_OK) {  
        Uri contactData = data.getData();  
        Cursor c =  managedQuery(contactData, null, null, null, null);  
        if (c.moveToFirst()) {  
            String name = c.getString(c.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));  
            Intent intent = new Intent(CurrentActivity.this, NewActivity.class);  
            intent.putExtra("name", name);  
            startActivityForResult(intent, 0);  
        }  
    }  
}

Но если я добавлю:

String number = c.getString(c.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER)); 

он заставляет закрывать

Может быть, другой способ получить их номер?

4b9b3361

Ответ 1

Телефонные номера

Телефонные номера хранятся в их собственной таблице, и их необходимо запрашивать отдельно. Чтобы запросить таблицу телефонных номеров, используйте URI, хранящийся в переменной SDK ContactsContract.CommonDataKinds.Phone.CONTENT_URI. Используйте WHERE, чтобы получить номера телефонов для указанного контакта.

    if (Integer.parseInt(cur.getString(
           cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
        Cursor pCur = cr.query(
        ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
        null, 
        ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", 
        new String[]{id}, null);
        while (pCur.moveToNext()) {
        // Do something with phones
        } 
        pCur.close();
    }

Выполните второй запрос к базе данных SQLite для контактов Android. Номера телефонов запрашиваются против URI, хранящихся в ContactsContract.CommonDataKinds.Phone.CONTENT_URI. Идентификатор контакта сохраняется в телефонной таблице как ContactsContract.CommonDataKinds.Phone.CONTACT_ID, а предложение WHERE используется для ограничения возвращаемых данных.

Адреса электронной почты

Запрос адресов электронной почты похож на номера телефонов. Для получения адресов электронной почты из базы данных необходимо выполнить запрос. Запросите URI, хранящийся в ContactsContract.CommonDataKinds.Email.CONTENT_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. Запрос электронной почты выполняется в URI в ContactsContract.CommonDataKinds.Email.CONTENT_URI, а предложение WHERE должно соответствовать полю ContactsContract.CommonDataKinds.Email.CONTACT_ID. Поскольку несколько адресов электронной почты могут быть сохранены в цикле через записи, возвращаемые в Курсор.

Дополнительные учебники здесь

Для этого метода требуется Android API версии 5 или выше.

Ответ 2

Основываясь на принятом ответе, если вы хотите перейти прямо к нужному адресу электронной почты и не требовать разрешения контактов, используйте примерно следующее:

private static final int REQUEST_CODE_EMAIL = 1;

void startSelectingEmail() {
    Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Email.CONTENT_URI);
    startActivityForResult(intent, REQUEST_CODE_EMAIL);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == Activity.RESULT_OK && requestCode == REQUEST_CODE_EMAIL) {
        Uri emailUri = data.getData();
        Cursor emailCursor = getContext().getContentResolver().query(emailUri, null, null, null, null);
        if (emailCursor != null) {
            if (emailCursor.moveToFirst()) {
                String email = emailCursor.getString(
                        emailCursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Email.DATA));
                String emailType = emailCursor.getString(
                        emailCursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Email.TYPE));
                Log.d(TAG, "Email: " + emailType + " " + email);
            }
            emailCursor.close();
        }
    }
}

Это не требует разрешения контактов для чтения адреса электронной почты, такого как методы двойного запроса выше. Это также делает так, что вам не нужно писать пользовательский интерфейс для того, чтобы пользователь мог выбрать подходящий адрес электронной почты для контактов с несколькими письмами, пользователь выбирает конкретное письмо в приложении "Контакты", чтобы получить только один результат.

Курсор возвращается с довольно несколькими столбцами в дополнение к простому адресу электронной почты, например, отображаемому имени, хотя это было проверено только на Nexus 5 под управлением Android M.