2013-03-06 109 views
21

我想將所有聯繫人的電話號碼保存在ArrayList中,但我找不到方法。有沒有辦法讓他們,而不是通過ContactsContract一個接一個地挑選他們?Android獲取ArrayList中的所有聯繫人電話號碼

+0

什麼是聯繫人合同 – PSR 2013-03-06 09:22:14

+0

此問題已在[本] [1]主題中回答。請檢查一下。 [1]:http://stackoverflow.com/a/12562234/1773155 – 2013-03-06 09:34:41

+0

肯定會套用你的需求使用[android-contact-extractor library](https://github.com/nitiwari-dev/android-接觸器) – nitesh 2017-05-12 10:05:56

回答

44
ContentResolver cr = mContext.getContentResolver(); //Activity/Application android.content.Context 
    Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 
    if(cursor.moveToFirst()) 
    { 
     ArrayList<String> alContacts = new ArrayList<String>(); 
     do 
     { 
      String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); 

      if(Integer.parseInt(cursor.getString(cursor.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()) 
       { 
        String contactNumber = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
        alContacts.add(contactNumber); 
        break; 
       } 
       pCur.close(); 
      } 

     } while (cursor.moveToNext()) ; 
    } 
+0

謝謝!有效! – 2013-03-07 02:21:29

+0

什麼是'contResv'? – tipycalFlow 2013-03-30 15:23:44

+2

contResv是ContentResolver的一個實例,你可以通過調用類android.content.Context的getContentResolver()方法來獲取 – Santhosh 2013-04-02 04:43:18

11

試試這個:

Cursor managedCursor = getContentResolver() 
    .query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
    new String[] {Phone._ID, Phone.DISPLAY_NAME, Phone.NUMBER}, null, null, Phone.DISPLAY_NAME + " ASC"); 

並通過光標穿越,你可以存儲在你選擇的任何數據結構,所有這些數據。

+0

這是迄今爲止最快的解決方案。 – milosmns 2016-10-19 16:49:56

+0

我不明白爲什麼其他答案與雙循環無處不在,而這種解決方案是非常清潔! – 2017-12-11 21:17:26

1

試試這個也得到所有聯繫人。

Cursor cursor = context.getContentResolver().query(Phone.CONTENT_URI, null , null , null, 
         "upper("+Phone.DISPLAY_NAME + ") ASC"); 
4

此代碼的工作速度比答案中的代碼快得多,因爲您不需要爲每個聯繫人進行額外的查詢。

private static final String CONTACT_ID = ContactsContract.Contacts._ID; 
private static final String HAS_PHONE_NUMBER = ContactsContract.Contacts.HAS_PHONE_NUMBER; 

private static final String PHONE_NUMBER = ContactsContract.CommonDataKinds.Phone.NUMBER; 
private static final String PHONE_CONTACT_ID = ContactsContract.CommonDataKinds.Phone.CONTACT_ID; 

public static ArrayList<String> getAll(Context context) { 
    ContentResolver cr = context.getContentResolver(); 

    Cursor pCur = cr.query(
      ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
      new String[]{PHONE_NUMBER, PHONE_CONTACT_ID}, 
      null, 
      null, 
      null 
    ); 
    if(pCur != null){ 
     if(pCur.getCount() > 0) { 
      HashMap<Integer, ArrayList<String>> phones = new HashMap<>(); 
      while (pCur.moveToNext()) { 
       Integer contactId = pCur.getInt(pCur.getColumnIndex(PHONE_CONTACT_ID)); 
       ArrayList<String> curPhones = new ArrayList<>(); 
       if (phones.containsKey(contactId)) { 
        curPhones = phones.get(contactId); 
       } 
       curPhones.add(pCur.getString(pCur.getColumnIndex(PHONE_NUMBER))); 
       phones.put(contactId, curPhones); 
      } 
      Cursor cur = cr.query(
        ContactsContract.Contacts.CONTENT_URI, 
        new String[]{CONTACT_ID, HAS_PHONE_NUMBER}, 
        HAS_PHONE_NUMBER + " > 0", 
        null,null); 
      if (cur != null) { 
       if (cur.getCount() > 0) { 
        ArrayList<String> contacts = new ArrayList<>(); 
        while (cur.moveToNext()) { 
         int id = cur.getInt(cur.getColumnIndex(CONTACT_ID)); 
         if(phones.containsKey(id)) { 
          contacts.addAll(phones.get(id)); 
         } 
        } 
        return contacts; 
       } 
       cur.close(); 
      } 
     } 
     pCur.close(); 
    } 
    return null; 
} 
+1

不適合在這裏,你永遠不會使用PHONE_NUMBER。我認爲你有一個PHONE_CONTACT_ID,你應該有PHONE_NUMBER – 2016-12-20 16:48:08

+0

@GregEnnis我現在無法檢查,但我認爲你是對的。我會編輯我的答案 – 2016-12-21 14:06:27

+0

除此之外,代碼很好。謝謝 – 2016-12-22 14:45:46

相關問題