讀取系統聯繫人android
因爲咱們以前一直使用的都是模擬器,電話簿裏面並無聯繫人存在,因此如今須要自 己手動添加幾個,以便稍後進行讀取。打開電話簿程序,界面如圖 7.1 所示。ide
圖 7.1佈局
能夠看到,目前電話簿裏是沒有任何聯繫人的,咱們能夠經過點擊 Create a new contact按鈕來對聯繫人進行建立。這裏就先建立兩個聯繫人吧,分別填入他們的姓名和手機號,如 圖 7.2 所示。this
圖 7.2xml
這樣準備工做就作好了,如今新建一個 ContactsTest 項目,讓咱們開始動手吧。 首先仍是來編寫一下佈局文件,這裏咱們但願讀取出來的聯繫人信息可以在 ListView 中對象
顯示,所以,修改 activity_main.xml 中的代碼,以下所示:blog
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" >get
<ListView android:id="@+id/contacts_view" android:layout_width="match_parent" android:layout_height="match_parent" >it
</ListView>io
</LinearLayout>
簡單起見,LinearLayout 裏就只放置了一個 ListView。接着修改 MainActivity 中的代碼,
以下所示:
public class MainActivity extends Activity { ListView contactsView; ArrayAdapter<String> adapter;
List<String> contactsList = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
contactsView = (ListView) findViewById(R.id.contacts_view);
adapter = new ArrayAdapter<String>(this, android.R.layout. simple_list_item_1, contactsList);
contactsView.setAdapter(adapter);
readContacts();
}
private void readContacts() { Cursor cursor = null;
try {
// 查詢聯繫人數據
cursor = getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
while (cursor.moveToNext()) {
// 獲取聯繫人姓名
String displayName = cursor.getString(cursor.getColumnIndex( ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
// 獲取聯繫人手機號
String number = cursor.getString(cursor.getColumnIndex( ContactsContract.CommonDataKinds.Phone.NUMBER));
contactsList.add(displayName + "\n" + number);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cursor != null) {
cursor.close();
}
}
}
}
在 onCreate()方法中,咱們首先獲取了 ListView 控件的實例,並給它設置好了適配器, 而後就去調用 readContacts()方法。下面重點看下 readContacts()方法,能夠看到,這裏使用 了 ContentResolver 的 query()方法來查詢系統的聯繫人數據。不過傳入的 Uri 參數怎麼有些奇 怪 啊 , 爲 什 麼 沒 有 調 用 Uri.parse() 方 法 去 解 析 一 個 內 容 URI 字 符 串 呢 ? 這 是 因 爲 ContactsContract.CommonDataKinds.Phone 類已經幫咱們作好了封裝,提供了一個CONTENT_URI 常量,而這個常量就是使用 Uri.parse()方法解析出來的結果。接着咱們對 Cursor 對象進行遍 歷 , 將 聯 系 人 姓 名 和 手 機 號 這 些 數 據 逐 個 取 出 , 聯 系 人 姓 名 這 一 列 對 應 的 常 量 ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,聯繫人手機號這一列對應的常 量是 ContactsContract.CommonDataKinds.Phone.NUMBER。兩個數據都取出以後,將它們進 行拼接,而且中間加上換行符,而後將拼接後的數據添加到 ListView 裏。最後千萬不要忘記 將 Cursor 對象關閉掉。
這樣就結束了嗎?還差一點點,讀取系統聯繫人也是須要聲明權限的,所以修改AndroidManifest.xml 中的代碼,以下所示:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.contactstest"
android:versionCode="1"
android:versionName="1.0" >
……
<uses-permission android:name="android.permission.READ_CONTACTS" />
……
</manifest>
加入了 android.permission.READ_CONTACTS 權限,這樣咱們的程序就能夠訪問到系統 的聯繫人數據了。如今纔算是大功告成,讓咱們來運行一下程序吧,效果如圖 7.3 所示。
圖 7.3
剛剛添加的兩個聯繫人的數據都成功讀取出來了!說明跨程序訪問數據的功能確實是實 現了。