Android 2.0讀取所有聯系人姓名與電話 – Android移動開發技術文章_手機開發 Android移動開發教學課程

 

在網上看到的讀取所有聯系人姓名與電話的代碼都是這樣的:

ContentResolver cr = getContentResolver();   

Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 

while (cursor.moveToNext()) 

    // 取得聯系人名字 

    int nameFieldColumnIndex = cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME); 

    String name = cursor.getString(nameFieldColumnIndex); 

    string += (name); 

 

    // 取得聯系人ID 

    String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); 

    Cursor phone = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " 

            + contactId, null, null); 

 

    // 取得電話號碼(可能存在多個號碼) 

    while (phone.moveToNext()) 

    { 

        String strPhoneNumber = phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 

        string += (":" + strPhoneNumber); 

    } 

    string += "\n"; 

    phone.close(); 

cursor.close();

如果有n個聯系人且每個聯系人都存有電話號碼的話,就得查詢n+1次。

在園子裡看到一個帖子說可以通過

Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "*")

取得所有聯系人的信息,我在Android 4.0模擬器跟2.3.7的真機上測試都不成功。

聯系人的各種類型的信息都存儲在Data表中,所以查詢Data表並限制其MIMETYPE為Phone.CONTENT_ITEM_TYPE即可以查到所有姓名與電話

Cursor phone = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, new String[] {

                CommonDataKinds.Phone.NUMBER, CommonDataKinds.Phone.DISPLAY_NAME }, null, null, null);

上述代碼可以查到所有聯系人的姓名與電話,但是如果直接挨個輸出的話會有問題,如果一個人存儲瞭兩個電話號碼的話,在Data表中會有兩條記錄,比如一個叫張三的人,存儲瞭他兩個電話:11111,22222。那麼輸出結果中會有兩條關於張三的記錄,並不會合並到一起,所以我想到先把cursor查詢到的所有數據存儲到Map裡,以DISPLAY_NAME為鍵,以NUMBER組成的List為值,即

HashMap<String,ArrayList<String>>

於是有瞭如下代碼:

ContentResolver cr = getContentResolver();

HashMap<String,ArrayList<String>> hs=new HashMap<String,ArrayList<String>>();

Cursor phone = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, new String[] {

    CommonDataKinds.Phone.NUMBER, CommonDataKinds.Phone.DISPLAY_NAME }, null, null, null);

while (phone.moveToNext()) {

  String strPhoneNumber = phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

  String name = phone.getString(phone.getColumnIndex(CommonDataKinds.Phone.DISPLAY_NAME));

  ArrayList<String> ad=hs.get(name);

  if(ad==null){

    ad=new ArrayList<String>();

    ad.add(strPhoneNumber);

    hs.put(dis, ad);

  }

  else

    ad.add(strPhoneNumber);

}

phone.close();

 

這樣就可以解決一個姓名對應多個號碼的問題,但還有問題,可能是兩個聯系人同名,但他們屬於不同的聯系人,在數據庫中表現為有不同的contact_id,那麼可以將上述代碼修改一下,將projection參數處添加上ContactsContract.CommonDataKinds.Phone.CONTACT_ID,然後把Map改為以contact_id為建,以DISPLAY_NAME與NUMBER組成的LIST為值,把DISPLAY_NAME統一存儲為LIST的第一項。當然也可以定義一個類,包含姓名字段及電話號碼組成的LIST字段,電話號碼的LIST中的元素還可以是Map,以號碼的TYPE為鍵。

 

作者:AngelDevil

  

發佈留言