2016-03-05 129 views
0

我正在使用下面的代碼來獲取本地手機通訊錄。它工作正常,並且可以非常快速地獲取聯繫人。如何有效地獲取本地手機通訊錄

但問題來了,在我的聯繫人列表中有幾個聯繫人有多個電子郵件和多個電話號碼。

如果有多個電話或電子郵件地址,它會多次重複同一個人的姓名。 如果我更改 ContactsContract.CommonDataKinds.Email.CONTENT_URIContactsContract.CommonDataKinds.Phone.CONTENT_URI那麼它會根據聯繫人的電話號碼的數量重複名稱。請幫助

private static final String[] PROJECTION = new String[]{ 
      ContactsContract.CommonDataKinds.Email.CONTACT_ID, 
      ContactsContract.CommonDataKinds.Nickname.DISPLAY_NAME, 
      ContactsContract.CommonDataKinds.Email.DATA, 
      ContactsContract.CommonDataKinds.Phone.NUMBER, 
    }; 

ContentResolver cr = mContext.getContentResolver(); 
Cursor cursor = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, PROJECTION, null, null, null); 

if (cursor != null) { 
    try { 
     final int contactIdIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.CONTACT_ID); 
     final int displayNameIndex = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME); 
     final int emailIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA); 
     final int phoneIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); 
     long contactId; 

     String displayName, email, phone, photo; 
     while (cursor.moveToNext()) { 
      mNK_UserModel = new NK_Contact(); 
      contactId = cursor.getLong(contactIdIndex); 
      displayName = cursor.getString(displayNameIndex); 

      //Adding display name 
      mNK_UserModel.setFirstName(displayName); 

      Util.DEBUG_LOG(1, "contact", "contact id :" + contactId); 

      al_PhoneContacts.add(mNK_UserModel); 
     } 
    } finally { 
     cursor.close(); 
    } 
} 

回答

0

如果我不得不猜測我會說你在while循環中缺少一個「break」。由於遊標試圖獲取下一個可用的列條目。但看看我過去爲我工作的解決方案。

它爲每一行使用一個單獨的遊標,使您可以更好地控制數據。

   Map<String, String> contactDataMap = new HashMap<String, String>(); 
       Uri contactData = data.getData(); 
       Cursor cursor = getContentResolver().query(contactData, null, null, null, null); 
       cursor.moveToFirst(); 
       String name = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME)); 
       String id = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts._ID)); 
       contactDataMap.put(NAME, (name != null)?name:""); 

       if (Integer.parseInt(cursor.getString(
         cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { 
        Cursor pCur = getContentResolver().query(
          ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
          null, 
          ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", 
          new String[]{id}, 
          null); 

        while (pCur.moveToNext()) { 
         String number = pCur.getString(pCur.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
         contactDataMap.put(PHONE, (number != null)?number:""); 
         break; 
        } 
        pCur.close(); 
       } 

       Cursor emailCur = getContentResolver().query(
         ContactsContract.CommonDataKinds.Email.CONTENT_URI, 
         null, 
         ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", 
         new String[]{id}, null); 

       while (emailCur.moveToNext()) { 
        String email = emailCur.getString(
          emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); 

        contactDataMap.put(MAIL, (email != null)?email:""); 
        break; 
       } 
       emailCur.close(); 

       cursor.close(); 
相關問題