5

我想要使用下面的代碼獲取手機通訊錄中所有可用聯繫人的詳細信息。但面臨重複價值的小問題。如何獲取所有聯繫人的名字,姓氏,電子郵件,電話號碼等,不需要重複

EDITED

實際代碼開始: -

private String refreshData() { 
     String emaildata = ""; 
     try { 
      ContentResolver cr = getBaseContext().getContentResolver(); 
      String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP 
        + " = '" + ("1") + "'"; 
      String sortOrder = ContactsContract.Contacts.DISPLAY_NAME 
        + " COLLATE LOCALIZED ASC"; 
      Cursor cur = cr 
        .query(ContactsContract.Contacts.CONTENT_URI, 
          null, 
          selection 
            + " AND " 
            + ContactsContract.Contacts.HAS_PHONE_NUMBER 
            + "=1", null, sortOrder); 

      if (cur.getCount() > 0) { 
       Log.i("Content provider", "Reading contact emails"); 
       while (cur.moveToNext()) { 
        mContactSet.add(cur.getString(cur 
          .getColumnIndex(ContactsContract.Contacts._ID))); 
       } 
      } else { 
       emaildata += "Data not found."; 
      } 
      cur.close(); 

      Log.i(TAG, "Total contacts = " + mContactSet.size()); 
      Iterator<String> iterator = mContactSet.iterator(); 

      while (iterator.hasNext()) { 
       String contactId = iterator.next(); 
       Log.i(TAG, "ID ==> " + contactId); 

       // Create query to use CommonDataKinds classes to fetch 
       // emails 
       Cursor emails = cr.query(
         ContactsContract.CommonDataKinds.Email.CONTENT_URI, 
         null, ContactsContract.CommonDataKinds.Email.CONTACT_ID 
           + " = " + contactId, null, null); 

       // Name 
       String whereName = ContactsContract.Data.MIMETYPE 
         + " = ? AND " 
         + ContactsContract.CommonDataKinds.StructuredName.CONTACT_ID 
         + " = ?"; 
       String[] whereNameParams = new String[] { 
         ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE, 
         contactId }; 
       Cursor nameCur = cr 
         .query(ContactsContract.Data.CONTENT_URI, 
           null, 
           whereName, 
           whereNameParams, 
           ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME); 
       while (nameCur.moveToNext()) { 
        String given = nameCur 
          .getString(nameCur 
            .getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME)); 
        String family = nameCur 
          .getString(nameCur 
            .getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME)); 
        String display = nameCur 
          .getString(nameCur 
            .getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME)); 

        Log.i(TAG, "First Name ==> " + given); 
        Log.i(TAG, "Last Name ==> " + family); 
        Log.i(TAG, "Display ==> " + display); 
       } 
       nameCur.close(); 

      } 
     } catch (Exception e) { 
      emaildata += "Exception : " + e + ""; 
     } 
     return emaildata; 
    } 

修改了查詢,並得到一些更好的結果,但仍然是問題是相同的部分聯繫人並獲得重複的值。

UPDATE: - 我已經使用HashSet獲得唯一的聯繫人ID,我也順利獲得,但是當我從聯繫人ID獲取名稱時,我獲得了2-3次相同的值聯繫人。我非常困惑,這是怎麼可能的,相同的聯繫人存儲2-3次相同的ID?

我需要使用HASHSET的名字,姓氏,電話號碼,電子郵件等嗎?還有其他的方法嗎?

+0

如果有可能,你可以嘗試DISTINCT與條件 –

+0

我有這個代碼獲取聯繫人。如何添加DISTINCT在這裏,因爲我是聯繫人的新手? String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP +「='」+(「1」)+「'」; String sortOrder = ContactsContract.Contacts.DISPLAY_NAME +「COLLATE LOCALIZED ASC」; 光標CUR = cr.query(\t \t ContactsContract.Contacts.CONTENT_URI,空,選擇+ 「和」 + ContactsContract.Contacts.HAS_PHONE_NUMBER + 「= 1」,NULL,中將sortOrder); – Scorpion

+0

@Scorpion使用java hashmap,HashSet或Java集合中的任何邏輯刪除重複項! –

回答

14

這是完整的解決方案

public ArrayList<HashMap<String, Object>> getContacts() { 

     ArrayList<HashMap<String, Object>> contacts = new ArrayList<HashMap<String, Object>>(); 
     final String[] projection = new String[] { RawContacts.CONTACT_ID, RawContacts.DELETED }; 

     @SuppressWarnings("deprecation") 
     final Cursor rawContacts = managedQuery(RawContacts.CONTENT_URI, projection, null, null, null); 

     final int contactIdColumnIndex = rawContacts.getColumnIndex(RawContacts.CONTACT_ID); 
     final int deletedColumnIndex = rawContacts.getColumnIndex(RawContacts.DELETED); 

     if (rawContacts.moveToFirst()) { 
      while (!rawContacts.isAfterLast()) { 
       final int contactId = rawContacts.getInt(contactIdColumnIndex); 
       final boolean deleted = (rawContacts.getInt(deletedColumnIndex) == 1); 

       if (!deleted) { 
        HashMap<String, Object> contactInfo = new HashMap<String, Object>() { 
         { 
          put("contactId", ""); 
          put("name", ""); 
          put("email", ""); 
          put("address", ""); 
          put("photo", ""); 
          put("phone", ""); 
         } 
        }; 
        contactInfo.put("contactId", "" + contactId); 
        contactInfo.put("name", getName(contactId)); 
        contactInfo.put("email", getEmail(contactId)); 
        contactInfo.put("photo", getPhoto(contactId) != null ? getPhoto(contactId) : ""); 
        contactInfo.put("address", getAddress(contactId)); 
        contactInfo.put("phone", getPhoneNumber(contactId)); 
        contactInfo.put("isChecked", "false"); 
        contacts.add(contactInfo); 
       } 
       rawContacts.moveToNext(); 
      } 
     } 

     rawContacts.close(); 

     return contacts; 
    } 

    private String getName(int contactId) { 
     String name = ""; 
     final String[] projection = new String[] { Contacts.DISPLAY_NAME }; 

     final Cursor contact = managedQuery(Contacts.CONTENT_URI, projection, Contacts._ID + "=?", new String[] { String.valueOf(contactId) }, null); 

     if (contact.moveToFirst()) { 
      name = contact.getString(contact.getColumnIndex(Contacts.DISPLAY_NAME)); 
      contact.close(); 
     } 
     contact.close(); 
     return name; 

    } 

    private String getEmail(int contactId) { 
     String emailStr = ""; 
     final String[] projection = new String[] { Email.DATA, // use 
       // Email.ADDRESS 
       // for API-Level 
       // 11+ 
       Email.TYPE }; 

     final Cursor email = managedQuery(Email.CONTENT_URI, projection, Data.CONTACT_ID + "=?", new String[] { String.valueOf(contactId) }, null); 

     if (email.moveToFirst()) { 
      final int contactEmailColumnIndex = email.getColumnIndex(Email.DATA); 

      while (!email.isAfterLast()) { 
       emailStr = emailStr + email.getString(contactEmailColumnIndex) + ";"; 
       email.moveToNext(); 
      } 
     } 
     email.close(); 
     return emailStr; 

    } 

    private Bitmap getPhoto(int contactId) { 
     Bitmap photo = null; 
     final String[] projection = new String[] { Contacts.PHOTO_ID }; 

     final Cursor contact = managedQuery(Contacts.CONTENT_URI, projection, Contacts._ID + "=?", new String[] { String.valueOf(contactId) }, null); 

     if (contact.moveToFirst()) { 
      final String photoId = contact.getString(contact.getColumnIndex(Contacts.PHOTO_ID)); 
      if (photoId != null) { 
       photo = getBitmap(photoId); 
      } else { 
       photo = null; 
      } 
     } 
     contact.close(); 

     return photo; 
    } 

    private Bitmap getBitmap(String photoId) { 
     final Cursor photo = managedQuery(Data.CONTENT_URI, new String[] { Photo.PHOTO }, Data._ID + "=?", new String[] { photoId }, null); 

     final Bitmap photoBitmap; 
     if (photo.moveToFirst()) { 
      byte[] photoBlob = photo.getBlob(photo.getColumnIndex(Photo.PHOTO)); 
      photoBitmap = BitmapFactory.decodeByteArray(photoBlob, 0, photoBlob.length); 
     } else { 
      photoBitmap = null; 
     } 
     photo.close(); 
     return photoBitmap; 
    } 

    private String getAddress(int contactId) { 
     String postalData = ""; 
     String addrWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 
     String[] addrWhereParams = new String[] { String.valueOf(contactId), ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE }; 

     Cursor addrCur = managedQuery(ContactsContract.Data.CONTENT_URI, null, addrWhere, addrWhereParams, null); 

     if (addrCur.moveToFirst()) { 
      postalData = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS)); 
     } 
     addrCur.close(); 
     return postalData; 
    } 

    private String getPhoneNumber(int contactId) { 

     String phoneNumber = ""; 
     final String[] projection = new String[] { Phone.NUMBER, Phone.TYPE, }; 
     final Cursor phone = managedQuery(Phone.CONTENT_URI, projection, Data.CONTACT_ID + "=?", new String[] { String.valueOf(contactId) }, null); 

     if (phone.moveToFirst()) { 
      final int contactNumberColumnIndex = phone.getColumnIndex(Phone.DATA); 

      while (!phone.isAfterLast()) { 
       phoneNumber = phoneNumber + phone.getString(contactNumberColumnIndex) + ";"; 
       phone.moveToNext(); 
      } 

     } 
     phone.close(); 
     return phoneNumber; 
    } 

如何使用?

ArrayList<HashMap<String, Object>> contactList = getContacts(); 
     System.out.println("Contact List : " +contactList); 

輸出:

[ 
{ 
phone=992-561-1618;848-807-4440;, 
contactId=1, 
[email protected], 
address=Zalavadia Strret 
Manavadar, Gujarat 362630 
India, 
[email protected];[email protected];, 
name=Biraj Zalavadia 
}, 
{ 
phone=992-511-1418;842-827-4450;, 
contactId=2, 
[email protected], 
address=Makadiya Strret 
Junagadh, Gujarat 364890 
India, 
[email protected];[email protected];, 
name=Niles patel 
} 
....... 
] 

注:

你會得到電話和電子郵件分號(;)如果一個以上的分離。

+0

非常感謝Biraj的幫助。但這裏的問題又是重複的數據。我得到3-4次相同的號碼,一些聯繫人的電子郵件地址相同。全部用分號(;)分隔。你能爲這個問題提出解決方案,這是我正在尋找的主要事情。此外,我想獲得電話號碼的類型,我現在正在處理這個問題,但是如果您對此有任何想法,那麼這將是一個很大的幫助。 – Scorpion

+0

謝謝.. ..就像一個魅力..! – OAEI

+0

+1如果它真的幫助你,謝謝 –

相關問題