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


讀取系統聯系人

 由於我們之前一直使用的都是模擬器,電話簿里面並沒有聯系人存在,所以現在需要自 己手動添加幾個,以便稍后進行讀取。打開電話簿程序,界面如圖 7.1 所示。

 

圖   7.1

 

可以看到,目前電話簿里是沒有任何聯系人的,我們可以通過點擊 Create a new contact按鈕來對聯系人進行創建。這里就先創建兩個聯系人吧,分別填入他們的姓名和手機號,如 圖 7.2 所示。

 

圖   7.2

 

這樣准備工作就做好了,現在新建一個 ContactsTest 項目,讓我們開始動手吧。 首先還是來編寫一下布局文件,這里我們希望讀取出來的聯系人信息能夠在 ListView 中

顯示,因此,修改 activity_main.xml 中的代碼,如下所示:

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" >

 

<ListView android:id="@+id/contacts_view" android:layout_width="match_parent" android:layout_height="match_parent" >

</ListView>

 

 

</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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM