2015-08-28 2 views
1

Я пытаюсь получить номера телефонов из моего сырого контакта по типу аккаунта. Используя ниже фрагмент кода,Получение контакта PHONE.CONTENT_URI возвращает повторяющиеся строки

String SELECTION = 
      ContactsContract.RawContacts.ACCOUNT_TYPE + "='" + Constants.ACCOUNT_TYPE + "'"; 

    ContentResolver cr = this.getContentResolver(); 
    Cursor cur = cr.query(ContactsContract.RawContacts.CONTENT_URI, 
      null, SELECTION, null, ContactsContract.Contacts.DISPLAY_NAME + " ASC"); 
    if (cur.getCount() > 0) { 
     while (cur.moveToNext()) { 
      String type = cur.getString(cur.getColumnIndex(ContactsContract.RawContacts.ACCOUNT_TYPE)); 
      String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
      //String phone = cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
      Log.e("number",name); 
      // hasPhoneNumber(cur.getString(cur.getColumnIndex(ContactsContract.RawContacts._ID))); 
     } 
     cur.close(); 
    } 

Я мог бы получить все контакты привязанной к типу счета, но, hasPhoneNumber (String ContactId) возвращает пустой указатель.

private boolean hasPhoneNumber(String id) { 
    Cursor pCur = this.getContentResolver().query(
      ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
      null, 
      ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", 
      new String[]{id}, null); 
    while (pCur.moveToNext()) { 
     String phoneNo = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
     phoneNo = phoneNo.replace(" ", ""); 
     if (Integer.parseInt(pCur.getString(
       pCur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { 
      Log.e("search", "found phone number"); 
      pCur.close(); 
      return true; 
     } 
     pCur.close(); 
    } 
    return false; 
} 

Однако, я решил выполнить мой запрос с PHONE.CONTENT_URL как:

String SELECTION = 
      ContactsContract.RawContacts.ACCOUNT_TYPE + "='" + Constants.ACCOUNT_TYPE + "'"; 

    ContentResolver cr = this.getContentResolver(); 
    Cursor cur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
      null, SELECTION, null, ContactsContract.Contacts.DISPLAY_NAME + " ASC"); 
    if (cur.getCount() > 0) { 
     while (cur.moveToNext()) { 
      String type = cur.getString(cur.getColumnIndex(ContactsContract.RawContacts.ACCOUNT_TYPE)); 
      String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
      String phone = cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
      Log.e("number",phone); 
      // hasPhoneNumber(cur.getString(cur.getColumnIndex(ContactsContract.RawContacts._ID))); 
     } 
     cur.close(); 
    } 

Это работает, как ожидается, кроме того, что у меня есть только три контакт, который соответствует такому запросу в моем списке контактов, но время цикл работает 6 раз, показывая каждый номер дважды. Как лучше всего это реализовать и что я делаю неправильно?

+0

Это, вероятно, ошибка, но это не связано с тем, как вы запрашиваете данные. Это больше связано с Google. Если вы попытаетесь открыть приложение Lollipop Messenger, вы увидите строки дубликатов в разделе «новое сообщение». Я также пытаюсь решить это, кстати, – Matteo

ответ

6

Вы можете попробовать использовать параметр REMOVE_DUPLICATE_ENTRIES на URI:

Uri uri = Phone.CONTENT_URI.buildUpon() 
     .appendQueryParameter(ContactsContract.REMOVE_DUPLICATE_ENTRIES, "1") 
     .build(); 

Однако, если у вас есть два сырых контакты с тем же номером, я не думаю, что вы можете устранить дублирующие потому что выше параметр запроса только делает Android применимым GROUP BY (RawContacts._ID, DATA1) к запросу.

+0

ContactsContract.REMOVE_DUPLICATE_ENTRIES добавлен в уровень API 21. – Sahil

0

Вот как я удалил дубликаты при запросе ContactsContract.CommonDataKinds.Phone.CONTENT_URI. У меня есть ArrayList, удерживающий все контакты. Обратите внимание, что я делаю с помощью boolean addNewContact. Я проверяю Если у меня есть другой контакт с тем же CONTACT_ID, и если я этого не сделаю, он добавит еще один контакт, но если он это сделает, он пропустит добавление этого контакта. Смотрите полный фрагмент кода здесь:

Cursor cur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
      null, null, null, null); 

    cur.moveToPosition(-1); 
    boolean addNewContact; 
    if (cur.getCount() > 0) { 
     while (cur.moveToNext()) { 
      String thumb = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.PHOTO_THUMBNAIL_URI)); 
      String id = cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID)); 
      String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 

      if (allContacts==null) 
       allContacts = new Vector<Contact>(); 


      addNewContact = true; 
      for (Contact addedC:allContacts){ 
       if (addedC.id.equals(id)) 
        addNewContact = false; 
      } 

      if (addNewContact) { 
       Contact c = new Contact(name, id); 

       if (thumb != null) 
        c.setThumb(cr, thumb); 
       allContacts.add(c); 
      } 
     } 
    } 

И это мой Contact класс:

public class Contact { 
    String name; 
    Bitmap thumb; 
    String id; 


    public Contact(String name, String id){ 
     this.name = name; 
     this.id = id; 
    } 



    public void setThumb(ContentResolver cr, String uri) { 

     try { 
      thumb = MediaStore.Images.Media.getBitmap(cr, Uri.parse(uri)); 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     if (thumb!=null) 
      thumb = getCroppedBitmap(thumb); 

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