1.獲取聯繫人姓名
一個簡單的例子,這個函數獲取設備上所有的聯繫人ID和聯繫人NAME。
- public void fetchAllContacts() {
- ContentResolver contentResolver = this.getContentResolver();
- Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,
- null, null, null, null);
- cursor.getCount();
- while(cursor.moveToNext()) {
- System.out.println(cursor.getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts._ID)));
- System.out.println(cursor.getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts.DISPLAY_NAME)));
- }
- cursor.close();
- }
執行結果:
- 11-05 14:13:09.987: I/System.out(4692): 13
- 11-05 14:13:09.987: I/System.out(4692): 張三
- 11-05 14:13:09.987: I/System.out(4692): 31
- 11-05 14:13:09.987: I/System.out(4692): 李四
解釋:
- ContentResolver contentResolver = this.getContentResolver();
this在這裏指的是MainActivity,ContentResolver直譯爲內容解析器,什麼東東?Android中程序間數據的共享是通過Provider/Resolver進行的。提供數據(內容)的就叫Provider,Resovler提供接口對這個內容進行解讀。
在這裏,系統提供了聯繫人的Provider,那麼我們就需要構建一個Resolver來讀取聯繫人的內容。
- Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,
- null, null, null, null);
public final Cursor query (Uri uri, String[] projection,String selection,String[] selectionArgs, StringsortOrder)
第一個參數,uri,rui是什麼呢?好吧,上面我們提到了Android提供內容的叫Provider,那麼在Android中怎麼區分各個Provider?有提供聯繫人的,有提供圖片的等等。所以就需要有一個唯一的標識來標識這個Provider,Uri就是這個標識,android.provider.ContactsContract.Contacts.CONTENT_URI就是提供聯繫人的內容提供者,可惜這個內容提供者提供的數據很少。
第二個參數,projection,真不知道爲什麼要用這個單詞,這個參數告訴Provider要返回的內容(列Column),比如Contacts Provider提供了聯繫人的ID和聯繫人的NAME等內容,如果我們只需要NAME,那麼我們就應該使用:
- Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,
- new String[]{android.provider.ContactsContract.Contacts.DISPLAY_NAME}, null, null, null);
第三個參數,selection,設置條件,相當於SQL語句中的where。null表示不進行篩選。如果我們只想返回名稱爲張三的數據,第三個參數應該設置爲:
- Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,
- new String[]{android.provider.ContactsContract.Contacts.DISPLAY_NAME},
- android.provider.ContactsContract.Contacts.DISPLAY_NAME + "='張三'", null, null);
- 11-05 15:30:32.188: I/System.out(10271): 張三
- Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,
- new String[]{android.provider.ContactsContract.Contacts.DISPLAY_NAME},
- android.provider.ContactsContract.Contacts.DISPLAY_NAME + "=?",
- new String[]{"張三"}, null);
效果和上面一句的效果一樣。
第五個參數,sortOrder,按照什麼進行排序,相當於SQL語句中的Order by。如果想要結果按照ID的降序排列:
- Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,
- null, null,null, android.provider.ContactsContract.Contacts._ID + " DESC");
- 11-05 16:00:32.808: I/System.out(12523): 31
- 11-05 16:00:32.808: I/System.out(12523): 李四
- 11-05 16:00:32.817: I/System.out(12523): 13
- 11-05 16:00:32.817: I/System.out(12523): 張三
- Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,
- null, null,null, android.provider.ContactsContract.Contacts._ID + " ASC");
- 11-05 15:59:10.327: I/System.out(12406): 13
- 11-05 15:59:10.327: I/System.out(12406): 張三
- 11-05 15:59:10.327: I/System.out(12406): 31
- 11-05 15:59:10.327: I/System.out(12406): 李四