2014-11-04 2 views
1

Я читаю имена контактов и телефонные номера из списка контактов на Android. Я успешно читаю имена. Однако, когда я нахожу поиск номера контактного телефона по имени (все это уникально в этом случае, это просто тест), он отлично работает только для одного контакта, не получает номера телефона для других и получает неправильный номер телефона для одного.Чтение контактных телефонов работает для некоторых, а не для других?

Вот код в моем методе getNumbers:

private String getNumber(String name){ 
    String returnMe=""; 
    ContentResolver contentResolver = getContentResolver(); 
    Cursor cursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null, 
      "DISPLAY_NAME = '" + getIntent().getStringExtra("name") + "'", null, null); 

    if(cursor.moveToFirst()){ 
     String identifier = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); 
     Cursor phones = contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
       null, ContactsContract.CommonDataKinds.Phone._ID + " = " + identifier, null, null); 
     while(phones.moveToNext()){ 
      returnMe = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
      int type = phones.getInt(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE)); 
      switch(type){ 
       case ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE: 
        System.out.println("mobile number found"); break; 
       default: 
        System.out.println("nothing found."); break; 
      } 
     } 
    } 
    return returnMe; 
} 

ответ

2

Вы делаете несколько вещей неправильно:

1) Второй запрос должен для таблицы Data, а не Телефонный стол:

Cursor phones = contentResolver.query(ContactsContract.Data.CONTENT_URI, ... 

и указать, что вы хотите номер телефона в столбце DATA1 в где положение:

Data.MIMETYPE = Phone.CONTENT_ITEM_TYPE 

2) Вам нужно отфильтровать результаты по RawContact в _ID

Это сравнивает _ID из Контакта грести с _ID из телефонной строки, которые имеют очень мало шансов быть такой же:

ContactsContract.CommonDataKinds.Phone._ID + " = " + identifier 

Это сравнивает Data.CONTACT_ID со свойством Contact._ID курсора

Data.CONTACT_ID + " = " + identifier 

Пример на JavaDoc странице Data дает более полный пример:

найти все данные данного типа для данного контакта

Cursor c = getContentResolver().query(Data.CONTENT_URI, 
     new String[] {Data._ID, Phone.NUMBER, Phone.TYPE, Phone.LABEL}, 
     Data.CONTACT_ID + "=?" + " AND " 
       + Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'", 
     new String[] {String.valueOf(contactId)}, null); 
+0

Рад, что я мог помочь. На самом деле, я думаю, что другой ответ тоже работает и использует только таблицу «Контакты», поэтому это проще. Контакты организованы в 3 таблицы: Контакты, RawContacts и Data. Каждая таблица имеет соответствующий класс, например. ContactsContract.Contacts. Затем вам нужно присоединиться к результатам, используя соответствующие ключи, как это было бы в SQL-запросе. Убедитесь, что вы прочитали документ обо всем, что https://developer.android.com/training/contacts-provider/index.html. –

0

Смотрите мой ответ:

ContentResolver cr = getContentResolver(); 
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 
    if (cur.getCount() > 0) { 
    while (cur.moveToNext()) { 
     String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID)); 
    String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
    if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { 
     //Query phone here 
     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()) { 
     // Get phone numbers here 
     } 
     pCur.close(); 
    } 
    } 
} 
} 
+0

Спасибо за образец, но я Мне действительно интересно учиться, а не расшифровывать. Можете ли вы дать мне объяснение относительно того, что вы делаете, и почему вы делаете это так против другого? – CoffeeSaurus

+0

Он дает мне те же контакты несколько раз. – Shivang

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