получить контактную информацию от 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)); 

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

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

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

Телефонные номера хранятся в их собственной таблице, и их необходимо запрашивать отдельно. Чтобы запросить таблицу телефонных номеров, используйте 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. Поскольку несколько адресов электронной почты могут храниться в цикле через записи, возвращаемые в Cursor.

Больше учебников здесь

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

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

 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.

Interesting Posts
Давайте будем гением компьютера.