2010-07-07 3 views
2

Мое приложение для Android должно получать информацию о контакте (а именно, номер телефона и имя). Я написал код с помощью getContentResolver().query(). В результатах я вижу, что имя и другую информацию, например, когда я в последний раз связывался с этим человеком, но не с номером телефона. Что я делаю не так?Не удается получить номер телефона в моем приложении для Android

Код:

Log.w("MyApp", "requesting " + phonesUri.toString()); 
Cursor contactCursor = context.getContentResolver().query(person, null, null, null, null); 
contactCursor.moveToFirst(); 

for (int i = 0; i < contactCursor.getColumnCount(); i ++) { 
    Log.w("MyApp", contactCursor.getColumnName(i) + ": " + contactCursor.getString(i)); 
} 

, который выводит это:

W/MyApp (21477): requesting content://contacts/people/169/phones 
W/MyApp (21477): times_contacted: 6 
W/MyApp (21477): custom_ringtone: null 
W/MyApp (21477): primary_organization: null 
W/MyApp (21477): phonetic_name: 
W/MyApp (21477): status: null 
W/MyApp (21477): label: null 
W/MyApp (21477): number: null 
W/MyApp (21477): type: null 
W/MyApp (21477): mode: null 
W/MyApp (21477): last_time_contacted: 1278113641980 
W/MyApp (21477): display_name: (name removed for privacy) 
W/MyApp (21477): im_handle: null 
W/MyApp (21477): _id: 169 
W/MyApp (21477): number_key: null 
W/MyApp (21477): starred: 0 
W/MyApp (21477): primary_email: null 
W/MyApp (21477): name: (name removed for privacy) 
W/MyApp (21477): primary_phone: null 
W/MyApp (21477): im_account: null 
W/MyApp (21477): notes: 
W/MyApp (21477): im_protocol: null 
W/MyApp (21477): send_to_voicemail: 0 

ответ

3
  1. Вам не нужно писать свой собственный метод итерационного для печати на экран/журнале, вызовите DatabaseUtils.dumpCursorToString(cursor); на курсора, чтобы получить строковое представление исходного результата.

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

Посмотрите этот учебник Working With Android Contacts

+0

Спасибо. Похоже, что старые вещи до-Eclair не работают надежно. Когда я переключился на ContactsContract, все стало работать. –

Смежные вопросы