Android利用Intent讀取和更新通訊錄
一、簡(jiǎn)介
本節(jié)演示如何在安卓系統(tǒng)中通過(guò)用戶配置文件(user profile)讀取和更新該手機(jī)的所有聯(lián)系人信息,以及如何導(dǎo)航到用戶配置文件中的這些聯(lián)系人。
二、基本概念
1、什么是 User Profile
用戶配置文件(user profile)保存的是機(jī)主信息以及該手機(jī)中所有聯(lián)系人的信息。
假定手機(jī)所有者的名字為“Mao mao yu”,那么,user profile保存的就是“Mao mao yu”的通訊錄(即機(jī)主所有聯(lián)系人的姓名、電話、郵箱、……等信息)。在Android 4中,這個(gè)保存聯(lián)系人信息的應(yīng)用程序稱為“People app”,而在Android 5.0及更高版本中,這個(gè)應(yīng)用程序又改稱為“Contacts app” 。
Android 6.0(API 23)模擬器已經(jīng)包含了【通訊錄】功能,利用它可直接手工添加手機(jī)所有者姓名及其聯(lián)系人,如下圖所示:
單擊【通訊錄】中的某個(gè)聯(lián)系人,例如單擊機(jī)主的名字(或者其他聯(lián)系人的名字),就可以在顯示的界面中修改這個(gè)人的姓名、電話、郵箱、住址等信息,或者添加新聯(lián)系人,這個(gè)功能大家在手機(jī)上用的太熟了,這里就不多說(shuō)了。
我們這一節(jié)的目標(biāo)就是學(xué)習(xí)如何在自己的應(yīng)用程序中通過(guò)代碼去添加或修改這個(gè)用戶配置文件(user profile)中的信息,而不是用它自身提供的功能去編輯。
2、權(quán)限要求
要在你的程序中讀和寫手機(jī)所有聯(lián)系人的數(shù)據(jù),你的應(yīng)用程序必須具有Read_Contacts和Write_Contacts權(quán)限。另外,要讀取和編輯用戶配置文件(user profile),你的應(yīng)用程序必須具有Read_Profile和Write_Profile權(quán)限。
或者說(shuō),必須具有下面的權(quán)限才能讀寫通訊錄和機(jī)主的用戶配置文件:
READ_CONTACTS
READ_PROFILE
WRITE_CONTACTS
WRITE_PROFILE
實(shí)際上,你手機(jī)上下載的各類應(yīng)用程序,只要有對(duì)應(yīng)的權(quán)限,都可以獲取和修改你的通訊錄(一般手機(jī)用戶都不是搞計(jì)算機(jī)的,因此也不太關(guān)心什么權(quán)限不權(quán)限,直接按下一步點(diǎn)下去,結(jié)果是默認(rèn)都給這些程序賦予了完全的讀寫權(quán)限)?;蛘哒f(shuō),只要你給這些應(yīng)用程序賦予了對(duì)應(yīng)的讀寫權(quán)限,那么你的通訊錄實(shí)際上就沒(méi)有一點(diǎn)安全可言了,這些程序想什么時(shí)候獲取就可以什么時(shí)候獲?。ㄐ孤冻鋈フ媸翘?jiǎn)單了),這也是為什么有那么多免費(fèi)的手機(jī)應(yīng)用拼命讓你去下載和使用的原因。
下圖是在VS2015中設(shè)置Read_Contacts和Read_Profile的辦法(通過(guò)單擊主菜單【項(xiàng)目】下的【屬性】彈出此界面):
按照同樣的辦法,可繼續(xù)設(shè)置WRITE_CONTACTS和WRITE_PROFILE權(quán)限。
3、獲取通訊錄信息(Reading Profile Data)
安卓早期的版本是通過(guò)ContactContracts.Contacts類來(lái)獲取手機(jī)上所有聯(lián)系人的列表信息的。從Android 4開(kāi)始又提供了一個(gè)新的ContactsContact.Profile類,該類提供了對(duì)設(shè)備所有者用戶配置文件(user profile)的訪問(wèn),利用它即可獲取和修改所有聯(lián)系人的名稱、電話號(hào)碼等數(shù)據(jù)。
向 ContactsContact.Profile.ContentUri 發(fā)出查詢即可讀取配置文件的數(shù)據(jù)。例如,下面的代碼讀取該用戶配置文件的顯示名稱:
var uri = ContactsContract.Contacts.ContentUri; string[] projection = { ContactsContract.Contacts.InterfaceConsts.DisplayName }; var cursor = ContentResolver.Query(uri, projection, null, null, null); if (cursor.MoveToFirst ()) { Console.WriteLine(cursor.GetString (cursor.GetColumnIndex (projection [0]))); }
4、更新聯(lián)系人信息(Update the User's Profile)
應(yīng)用程序只要有對(duì)應(yīng)的讀寫權(quán)限,就可以像其他普通的應(yīng)用程序一樣與用戶配置文件(user profile)中的數(shù)據(jù)進(jìn)行交互。例如,調(diào)用ContentResolver.Update方法可更新配置文件中的顯示名稱,該方法通過(guò)ContactsContract.Profile.ContentRawContactsUri屬性檢索Uri,如下面的代碼所示:
var values = new ContentValues (); values.Put (ContactsContract.Contacts.InterfaceConsts.DisplayName, "Mao mao yu"); ContentResolver.Update (ContactsContract.Profile.ContentRawContactsUri,values, null, null);
注意:不能顯式創(chuàng)建用戶配置文件(user's profiile),否則將出現(xiàn)異常。
接下來(lái),可創(chuàng)建一個(gè)ReadBackName方法,如下面的代碼所示。調(diào)用此方法可驗(yàn)證添加到用戶配置文件的名稱是否確實(shí)被更新了。在這個(gè)方法中,首先獲取用戶的配置文件的 URI 并配置投影,從此配置文件中僅僅讀取一列 (用戶的顯示名稱)。為了訪問(wèn)用戶的配置文件數(shù)據(jù),接下來(lái)創(chuàng)建了一個(gè)游標(biāo)對(duì)象。如果成功地初始化游標(biāo),則它被移動(dòng)到用戶配置文件中的第一項(xiàng)。在此位置 (用戶顯示名稱) 的第一列中讀取名稱并將其打印到控制臺(tái)。如果這些操作成功,ReadBackName 返回 true;否則返回 false。
bool ReadBackName() { Android.Net.Uri uri = ContactsContract.Profile.ContentUri; string[] projection = { ContactsContract.Contacts.InterfaceConsts.DisplayName }; var cursor = ContentResolver.Query(uri, projection, null, null, null); if (cursor != null) { if (cursor.MoveToFirst()) { Console.WriteLine(cursor.GetString(cursor.GetColumnIndex(projection[0]))); return true; } } return false; }
添加一個(gè)ViewProfile方法,該方法會(huì)自動(dòng)調(diào)用Contacts App顯示user profile中的信息:
void ViewProfile () { Intent intent = new Intent (Intent.ActionView, ContactsContract.Profile.ContentUri); StartActivity (intent); }
注意:僅在Android 4及更高版本中才可以使用手機(jī)所有者的用戶配置文件。另外,在用戶配置文件可以更新之前,必須先手動(dòng)創(chuàng)建聯(lián)系人。
關(guān)于ContactContracts.Profile 的更多信息,請(qǐng)參見(jiàn) ContactsContract.Profile 類。
三、示例—ch1204ReadContacts
本示例演示如何獲取通訊錄中的聯(lián)系人。
1、運(yùn)行截圖
單擊【讀取通訊錄】按鈕,即得到下面右側(cè)的截圖。
單擊【修改機(jī)主信息】按鈕,即得到下面的修改界面:
下圖是在Android 4.4.2(API 19)下運(yùn)行的結(jié)果:
2、主要設(shè)計(jì)步驟
(1)設(shè)置權(quán)限
在VS2015開(kāi)發(fā)環(huán)境下,選擇主菜單的【項(xiàng)目】à【ContactsDemo屬性】,在彈出的窗口中勾選下面的權(quán)限:
READ_CONTACTS
READ_PROFILE
WRITE_CONTACTS
WRITE_PROFILE
或者在【解決方案資源管理器】中,鼠標(biāo)雙擊項(xiàng)目的【Properties】進(jìn)入設(shè)置界面,然后勾選上面的選項(xiàng)。
設(shè)置完畢后,在AndroidManifest.xml文件中就會(huì)自動(dòng)添加下面的代碼:
<uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.READ_PROFILE" /> <uses-permission android:name="android.permission.WRITE_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_PROFILE" />
(2)添加改ch1204_Main.axml文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:background="@android:color/background_light" android:layout_width="fill_parent" android:layout_height="fill_parent"> <Button android:text="讀取通訊錄" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/btnRead" /> <Button android:text="修改機(jī)主信息" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/btnUpdate" /> </LinearLayout>
(3)添加ch1204_ContactListItem.axml文件
在Resources/layout/下添加該文件。
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="15dip" />
(4)添加ch1204ReadContactActivity.cs文件
using System.Collections.Generic; using Android.App; using Android.Content; using Android.OS; using Android.Widget; using Android.Provider; namespace MyDemos.SrcDemos { [Activity(Label = "【例12-4】讀取和更新通訊錄")] public class ch1204ReadContactActivity : ListActivity { protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); var uri = ContactsContract.Contacts.ContentUri; string[] projection = { ContactsContract.Contacts.InterfaceConsts.Id, ContactsContract.Contacts.InterfaceConsts.DisplayName }; var cursor = ContentResolver.Query(uri, projection, null, null, null); var contactList = new List<string>(); if (cursor.MoveToFirst()) { do { contactList.Add(cursor.GetString(cursor.GetColumnIndex(projection[1]))); } while (cursor.MoveToNext()); } cuesor.Close(); ListAdapter = new ArrayAdapter<string>(this, Resource.Layout.ch1204_ContactListItem, contactList); } } }
注意該類繼承自ListActivity,不是繼承自Activity。
(5)添加ch1204ReadContactsMain.cs文件
using Android.App; using Android.Content; using Android.OS; using Android.Widget; using Android.Provider; namespace MyDemos.SrcDemos { [Activity(Label = "【例12-4】讀取和更新通訊錄")] public class ch1204ReadContactsMain : Activity { protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.ch1204_Main); var btnRead = FindViewById<Button>(Resource.Id.btnRead); btnRead.Click += delegate { StartActivity(typeof(ch1204ReadContactActivity)); }; var btnUpdate = FindViewById<Button>(Resource.Id.btnUpdate); btnUpdate.Click += delegate { NameOwner(); if (ReadBackName()) { Intent intent = new Intent(Intent.ActionView, ContactsContract.Profile.ContentUri); StartActivity(intent); } }; } /// <summary> /// 定義手機(jī)機(jī)主的名字 /// </summary> void NameOwner() { ContentValues values = new ContentValues(); //將“Rainmj”插入到已存在的user profile中 values.Put(ContactsContract.Contacts.InterfaceConsts.DisplayName, "Rainmj"); //更新user profile ContentResolver.Update(ContactsContract.Profile.ContentRawContactsUri, values, null, null); } /// <summary> /// 檢查“更新user profile”是否成功 /// </summary> /// <returns></returns> bool ReadBackName() { //獲取user profile的Uri Android.Net.Uri uri = ContactsContract.Profile.ContentUri; //配置投影,指定準(zhǔn)備從user profile中讀取的列 string[] projection = { ContactsContract.Contacts.InterfaceConsts.DisplayName }; var cursor = ContentResolver.Query(uri, projection, null, null, null); if (cursor != null) { if (cursor.MoveToFirst()) { cursor.Close(); //Console.WriteLine(cursor.GetString(cursor.GetColumnIndex(projection[0]))); return true; } } return false; } } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android開(kāi)發(fā)實(shí)現(xiàn)刪除聯(lián)系人通話記錄的方法
- Android獲取手機(jī)通話記錄的方法
- Android通話記錄備份實(shí)現(xiàn)代碼
- Android破解微信獲取聊天記錄和通訊錄信息(靜態(tài)方式)
- Android通訊錄開(kāi)發(fā)之刪除功能的實(shí)現(xiàn)方法
- Android獲取手機(jī)通訊錄、sim卡聯(lián)系人及調(diào)用撥號(hào)界面方法
- Android實(shí)現(xiàn)通訊錄效果——獲取手機(jī)號(hào)碼和姓名
- Android實(shí)現(xiàn)仿通訊錄側(cè)邊欄滑動(dòng)SiderBar效果代碼
- Android手機(jī)聯(lián)系人快速索引(手機(jī)通訊錄)
- Android跳轉(zhuǎn)到通訊錄獲取用戶名稱和手機(jī)號(hào)碼的實(shí)現(xiàn)思路
- Android基于BaseExpandableListAdapter實(shí)現(xiàn)的二級(jí)列表仿通話記錄功能詳解
相關(guān)文章
Android開(kāi)發(fā)中通過(guò)手機(jī)號(hào)+短信驗(yàn)證碼登錄的實(shí)例代碼
最近在開(kāi)發(fā)一個(gè)android的項(xiàng)目,需要通過(guò)獲取手機(jī)驗(yàn)證碼來(lái)完成登錄功能,接下來(lái)通過(guò)實(shí)例代碼給大家分享手機(jī)號(hào)+短信驗(yàn)證碼登錄的實(shí)現(xiàn)方法,需要的的朋友參考下吧2017-05-05Android實(shí)現(xiàn)下載zip壓縮文件并解壓的方法(附源碼)
這篇文章主要給大家介紹了利用Android實(shí)現(xiàn)下載zip壓縮文件并解壓的方法,文中給出了示例代碼并提供了源碼下載,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-02-02Android AsyncTask的缺陷和問(wèn)題總結(jié)
這篇文章主要介紹了Android AsyncTask的缺陷和問(wèn)題總結(jié)的相關(guān)資料,需要的朋友可以參考下2017-03-03基于Android中dp和px之間進(jìn)行轉(zhuǎn)換的實(shí)現(xiàn)代碼
本篇文章是對(duì)在Android中dp和px之間進(jìn)行轉(zhuǎn)換的實(shí)現(xiàn)方法進(jìn)行了分析介紹,需要的朋友參考下2013-05-05android實(shí)現(xiàn)倒計(jì)時(shí)動(dòng)態(tài)圈
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)倒計(jì)時(shí)動(dòng)態(tài)圈,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01ToolBar中menu無(wú)法同時(shí)顯示圖標(biāo)和文字問(wèn)題的解決方法
這篇文章主要為大家詳細(xì)介紹了ToolBar中menu無(wú)法同時(shí)顯示圖標(biāo)和文字問(wèn)題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09