Android利用Intent读取和更新通讯录

一、简介
本节演示如何在安卓系统中通过用户配置文件(user profile)读取和更新该手机的所有联系人信息,以及如何导航到用户配置文件中的这些联系人。

二、基本概念
 1、什么是 User Profile

用户配置文件(user profile)保存的是机主信息以及该手机中所有联系人的信息。

假定手机所有者的名字为“Mao mao yu”,那么,user profile保存的就是“Mao mao yu”的通讯录(即机主所有联系人的姓名、电话、邮箱、……等信息)。在Android 4中,这个保存联系人信息的应用程序称为“People app”,而在Android 5.0及更高版本中,这个应用程序又改称为“Contacts app” 。

Android 6.0(API 23)模拟器已经包含了【通讯录】功能,利用它可直接手工添加手机所有者姓名及其联系人,如下图所示:

单击【通讯录】中的某个联系人,例如单击机主的名字(或者其他联系人的名字),就可以在显示的界面中修改这个人的姓名、电话、邮箱、住址等信息,或者添加新联系人,这个功能大家在手机上用的太熟了,这里就不多说了。

我们这一节的目标就是学习如何在自己的应用程序中通过代码去添加或修改这个用户配置文件(user profile)中的信息,而不是用它自身提供的功能去编辑。

2、权限要求

要在你的程序中读和写手机所有联系人的数据,你的应用程序必须具有Read_Contacts和Write_Contacts权限。另外,要读取和编辑用户配置文件(user profile),你的应用程序必须具有Read_Profile和Write_Profile权限。

或者说,必须具有下面的权限才能读写通讯录和机主的用户配置文件:

READ_CONTACTS

READ_PROFILE

WRITE_CONTACTS

WRITE_PROFILE

实际上,你手机上下载的各类应用程序,只要有对应的权限,都可以获取和修改你的通讯录(一般手机用户都不是搞计算机的,因此也不太关心什么权限不权限,直接按下一步点下去,结果是默认都给这些程序赋予了完全的读写权限)。或者说,只要你给这些应用程序赋予了对应的读写权限,那么你的通讯录实际上就没有一点安全可言了,这些程序想什么时候获取就可以什么时候获取(泄露出去真是太简单了),这也是为什么有那么多免费的手机应用拼命让你去下载和使用的原因。

下图是在VS2015中设置Read_Contacts和Read_Profile的办法(通过单击主菜单【项目】下的【属性】弹出此界面):

按照同样的办法,可继续设置WRITE_CONTACTS和WRITE_PROFILE权限。

3、获取通讯录信息(Reading Profile Data)

安卓早期的版本是通过ContactContracts.Contacts类来获取手机上所有联系人的列表信息的。从Android 4开始又提供了一个新的ContactsContact.Profile类,该类提供了对设备所有者用户配置文件(user profile)的访问,利用它即可获取和修改所有联系人的名称、电话号码等数据。

向 ContactsContact.Profile.ContentUri 发出查询即可读取配置文件的数据。例如,下面的代码读取该用户配置文件的显示名称:

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、更新联系人信息(Update the User's Profile)

应用程序只要有对应的读写权限,就可以像其他普通的应用程序一样与用户配置文件(user profile)中的数据进行交互。例如,调用ContentResolver.Update方法可更新配置文件中的显示名称,该方法通过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);

注意:不能显式创建用户配置文件(user's profiile),否则将出现异常。

接下来,可创建一个ReadBackName方法,如下面的代码所示。调用此方法可验证添加到用户配置文件的名称是否确实被更新了。在这个方法中,首先获取用户的配置文件的 URI 并配置投影,从此配置文件中仅仅读取一列 (用户的显示名称)。为了访问用户的配置文件数据,接下来创建了一个游标对象。如果成功地初始化游标,则它被移动到用户配置文件中的第一项。在此位置 (用户显示名称) 的第一列中读取名称并将其打印到控制台。如果这些操作成功,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; 

}

添加一个ViewProfile方法,该方法会自动调用Contacts App显示user profile中的信息:

void ViewProfile () 

{ 

 Intent intent = new Intent (Intent.ActionView, ContactsContract.Profile.ContentUri); 

 StartActivity (intent); 

}

注意:仅在Android 4及更高版本中才可以使用手机所有者的用户配置文件。另外,在用户配置文件可以更新之前,必须先手动创建联系人。

关于ContactContracts.Profile 的更多信息,请参见 ContactsContract.Profile 类。

三、示例—ch1204ReadContacts
 本示例演示如何获取通讯录中的联系人。

1、运行截图

单击【读取通讯录】按钮,即得到下面右侧的截图。

单击【修改机主信息】按钮,即得到下面的修改界面:

下图是在Android 4.4.2(API 19)下运行的结果:

2、主要设计步骤

(1)设置权限

在VS2015开发环境下,选择主菜单的【项目】à【ContactsDemo属性】,在弹出的窗口中勾选下面的权限:

READ_CONTACTS

READ_PROFILE

WRITE_CONTACTS

WRITE_PROFILE

或者在【解决方案资源管理器】中,鼠标双击项目的【Properties】进入设置界面,然后勾选上面的选项。

设置完毕后,在AndroidManifest.xml文件中就会自动添加下面的代码:

<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="修改机主信息"
 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>
 /// 定义手机机主的名字
 /// </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;

 //配置投影,指定准备从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;
 }
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android获取手机通讯录、sim卡联系人及调用拨号界面方法

    android获取手机通讯录联系人信息 复制代码 代码如下: private void getPhoneContacts() {        ContentResolver resolver = this.getContentResolver();                // 获取手机联系人       Cursor phoneCursor = resolver.query(Phone.CONTENT_URI,                  new String[] { Phone

  • Android破解微信获取聊天记录和通讯录信息(静态方式)

    一.猜想数据存放路径 微信现在是老少皆宜,大街小巷都在使用,已经替代了传统的短信聊天方式了,只要涉及到聊天就肯定有隐私消息,那么本文就来讲解如何获取微信的聊天记录以及通讯录信息. 首先我们在没有网络的时候,打开微信同样可以查看聊天记录,说明微信会把聊天记录保存到本地,那么这么多信息肯定会保存在数据库中,所以我们可以去查看微信的databases目录看看内容: 可惜的是,我们在这个里面并没有发现一些有用的数据,所以这时候就了解到了微信因为把重要信息的数据库存在其他目录下面,我们可以直接把微信的整个

  • Android跳转到通讯录获取用户名称和手机号码的实现思路

    效果图如下所示: 先给大家说下实现android 跳转到通讯录的实现思路: 1.点击跳转到通讯录界面 2.获取通讯录姓名和手机号码 3.回调显示姓名和手机号码 1首先是跳转到通讯录界面 Uri uri = Uri.parse("content://contacts/people"); Intent intent = new Intent(Intent.ACTION_PICK, uri); startActivityForResult(intent, 0); 通过设置通讯录url跳转,可

  • Android获取手机通话记录的方法

    Android如何获取手机通话记录,本文为大家揭晓. 获取手机通话记录流程: 1. 获取ContentResolver; ContentResolver resolver = getContentResolver(); 2.resolver.query(*); 需要传入通话记录的URI:CallLog.Calls.CONTENT_URI 3.对查询得到的Cursor进行数据获取. 主要代码如下: MainActivity.java package com.noonecode.contentres

  • Android实现通讯录效果——获取手机号码和姓名

    首先给大家展示下运行效果图: 由于通讯录在手机里是以数据库贮存的 所以我们可以通过一个方法 context.getContentResolver().query(Phone.CONTENT_URI, null, null, null, null); 来获得通讯录 ,这个方法返回一个游标的数据类型,通过moveToNext()方法来获取所有的手机号码信息 当然读取手机通讯录需要权限 在adnroidManifest文件中声明即可 由于我也实现了打电话的功能 所以也要声明权限 <uses-permi

  • Android通话记录备份实现代码

    (一) 前言 Android默认提供了联系人备份到sd卡的功能(代码在com.android.vcard包里面),我们可以把联系人导出成.vcf文件存在sd卡中:如果换手机了,我们又可以把联系人从sd卡文件中导入进来.那么,通话记录我们也能不能做出类似的功能呢?答案是肯定的! (二) 导出通话记录 既然是备份通话记录,那就肯定包括导出和导入的功能,这里我们先讲导出通话记录. 1. 根据通话记录导出的规范,导出的文件一般以.vcl后缀结尾,中间的内容是 复制代码 代码如下: BEGIN:VCALL

  • Android开发实现删除联系人通话记录的方法

    本文实例讲述了Android开发实现删除联系人通话记录的方法.分享给大家供大家参考,具体如下: 1. 负责存放呼叫记录的内容提供者源码在 ContactsProvider 项目下: 源码路径: com/Android/providers/contacts/CallLogProvider.Java 使用到的数据库在: /data/data/com.android.providers.contacts/databases/contacts2.db 表名:calls 呼叫记录有三种类型: 来电:Cal

  • Android手机联系人快速索引(手机通讯录)

    最近需要实现一个手机通讯录的快速索引功能.根据姓名首字母快速索引功能.下面是一个手机联系人快速索引的效果,总体来说代码不算难,拼音转换的地方略有复杂.下面上源码:源码中有注释. 下面是效果图: MainActivity: import java.util.ArrayList; import java.util.Collections; import java.util.List; import android.app.Activity; import android.os.Bundle; imp

  • Android通讯录开发之删除功能的实现方法

    无论是Android开发或者是其他移动平台的开发,ListView肯定是一个大咖,那么对ListView的操作肯定是不会少的,上一篇博客介绍了如何实现全选和反选的功能,本篇博客介绍删除功能,删除列表中的项无谓就是及时刷新列表,这又跟UI线程扯上关系了,还是那句话,数据的更新通知一定要在UI线程上做,不然会出现各种错误,比如出现adapter数据源改变,但没有及时收到通知的情况.在执行遍历删除的时候,最好不要每删一个就直接通知,下面是我的实现方法,将需要删除的contact保存到一个List然后通

  • Android实现仿通讯录侧边栏滑动SiderBar效果代码

    本文实例讲述了Android实现仿通讯录侧边栏滑动SiderBar效果代码.分享给大家供大家参考,具体如下: 之前看到某些应用的侧边栏做得不错,想想自己也弄一个出来,现在分享出来,当然里面还有不足的地方,请大家多多包涵. 先上图: 具体实现的代码如下: package com.freesonfish.listview_index; import android.content.Context; import android.graphics.Canvas; import android.grap

  • Android基于BaseExpandableListAdapter实现的二级列表仿通话记录功能详解

    本文实例讲述了Android基于BaseExpandableListAdapter实现的二级列表仿通话记录功能.分享给大家供大家参考,具体如下: android SDK中带有这样类似的例子,但是那个还是静态数据,没有实际应用价值,参考意义不大. 网上找了很多,还是那样的情况,几乎是同一篇文章,大家转来转去.况且,那篇例子也是静态的数据. 还是自己试试,自己写一个吧.程序读取手机系统的通话记录,按联系人分组,显示到列表. 开发工具:eclipse 运行环境:htc G9 android2.3.3

随机推荐