android: 經過內容提供器讀取系統聯繫人

讀取系統聯繫人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

剛剛添加的兩個聯繫人的數據都成功讀取出來了!說明跨程序訪問數據的功能確實是實 現了。

相關文章
相關標籤/搜索