亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android利用Intent讀取和更新通訊錄

 更新時(shí)間:2016年06月15日 15:19:04   作者:rainmj  
這篇文章主要介紹了Android利用Intent讀取和更新通訊錄的相關(guān)資料,通過(guò)用戶配置文件(user profile)讀取和更新該手機(jī)的所有聯(lián)系人信息,需要的朋友可以參考下

一、簡(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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論