получите контактную информацию от средства выбора контакта андроида

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

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)); 

это вызывает завершения

Возможно, существует другой способ получить их число?

36
задан Michael Celey 8 April 2013 в 18:46
поделиться

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 или выше.

62
ответ дан 27 November 2019 в 05:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: