这个过程有三步:
1)许可向你的应用程序的manifest中添加读取通讯录数据的许可
  <uses-permission android:name="android.permission.READ_CONTACTS" />  
  <uses-permission android:name="android.permission.WRITE_CONTACTS" />

2)调用Contact Picker
在你的activity中,创建一个Intent,用来请求系统查找一个能够执行一个从Contacts URI的项目中发出的PICK动作的activity,
Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
调用startActivityForResult在Intent中传递(和一个整数的请求代码,在这个例子中是PICK CONTACT )。这将导致android启动一个已经被等级的activity,用来支持在People.CONTENT URI上的ACTION_PICK ,然后当按下选择(或者取消)的时候返回到这个activity。startActivityForResult(intent, PICK_CONTACT);

3)仍然在你的activity中,重写onActivityResul方法来监听在你的第二个步骤中启动的activi'select a contact' activity的回调。你应该检查反馈的请求代码是否匹配你的期望值,结果代码是否是 RESULT_OK。
通过在数据Intent参数中调用getData()你可以获得选择的联系人的URI。为了获得选择的联系人的名字你需要使用URI从返回的游标中创建一个新的查询和提取的参数。
@Overridepublic void onActivityResult(int reqCode, int resultCode, Intent data) {
super.onActivityResult(reqCode, resultCode, data);
switch (reqCode) {
case (PICK_CONTACT) :
if (resultCode == Activity.RESULT_OK) {
Uri contactData = data.getData();
Cursor c = managedQuery(contactData, null, null, null, null);
if (c.moveToFirst()) {
String name = c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));}}break;}}

然后是例子奉上:

  1. import android.app.Activity;
  2. import android.content.ContentResolver;
  3. import android.content.Intent;
  4. import android.database.Cursor;
  5. import android.net.Uri;
  6. import android.os.Bundle;
  7. import android.provider.ContactsContract;
  8. import android.view.View;
  9. import android.widget.EditText;
  10.  
  11. public class MainActivity extends Activity {
  12.  
  13. EditText text;
  14. String username,usernumber;
  15.  
  16. @Override
  17. public void onCreate(Bundle savedInstanceState) {
  18. super.onCreate(savedInstanceState);
  19. setContentView(R.layout.activity_main);
  20. text = (EditText)findViewById(R.id.number);
  21. }
  22.  
  23. public void click(View v){
  24. startActivityForResult(new Intent(
  25. Intent.ACTION_PICK,ContactsContract.Contacts.CONTENT_URI), 0);
  26. }
  27.  
  28. @Override
  29. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  30. super.onActivityResult(requestCode, resultCode, data);
  31. if (resultCode == Activity.RESULT_OK) {
  32. ContentResolver reContentResolverol = getContentResolver();
  33. Uri contactData = data.getData();
  34. @SuppressWarnings("deprecation")
  35. Cursor cursor = managedQuery(contactData, null, null, null, null);
  36. cursor.moveToFirst();
  37. username = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
  38. String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
  39. Cursor phone = reContentResolverol.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
  40. null,
  41. ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId,
  42. null,
  43. null);
  44. while (phone.moveToNext()) {
  45. usernumber = phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
  46. text.setText(usernumber+" ("+username+")");
  47. }
  48.  
  49. }
  50. }
  51. }

简洁的?

  1. private static final int REQUEST_CONTACT = 1;
  2.  
  3. private void startContact() {
  4.  
  5. Intent intent = new Intent();
  6.  
  7. intent.setAction(Intent.ACTION_PICK);
  8.  
  9. intent.setData(ContactsContract.Contacts.CONTENT_URI);
  10.  
  11. startActivityForResult(intent, REQUEST_CONTACT);
  12.  
  13. }
  14.  
  15. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  16.  
  17. if (requestCode == REQUEST_CONTACT) {
  18.  
  19. if (resultCode == RESULT_OK) {
  20.  
  21. if (data == null) {
  22.  
  23. return;
  24.  
  25. }
  26.  
  27. Uri result = data.getData();
  28.  
  29. contactId = result.getLastPathSegment();
  30.  
  31. contactName = getPhoneContacts(contactId);
  32.  
  33. }
  34.  
  35. }

Android 调用系统通讯录的更多相关文章

  1. Android调用系统相册和拍照的Demo

    最近我在群里看到有好几个人在交流说现在网上的一些Android调用系统相册和拍照的demo都有bug,有问题,没有一个完整的.确实是,我记得一个月前,我一同学也遇到了这样的问题,在低版本的系统中没问题 ...

  2. iOS调用系统通讯录获取姓名电话号码(转)

    原文地址:http://blog.csdn.net/idoshi201109/article/details/46007125 OS调用系统通讯录获取姓名电话号码 (iOS 8.0 Xcode6.3可 ...

  3. Android调用系统相机、自己定义相机、处理大图片

    Android调用系统相机和自己定义相机实例 本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,而且因为涉及到要把拍到的照片显示出来,该样例也会涉及到Android载入大图片时候的处 ...

  4. Android调用系统相机、自定义相机、处理大图片

    Android调用系统相机和自定义相机实例 本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显示出来,该例子也会涉及到Android加载大图片时候的处理 ...

  5. Android 调用系统分享文字、图片、文件,可直达微信、朋友圈、QQ、QQ空间、微博

    原文:Android 调用系统分享文字.图片.文件,可直达微信.朋友圈.QQ.QQ空间.微博 兼容SDK 18以上的系统,直接调用系统分享功能,分享文本.图片.文件到第三方APP,如:微信.QQ.微博 ...

  6. Android调用系统照相机

    ndroid调用系统相机实现拍照功能 在实现拍照的功能时遇到了很多问题,搜索了很多资料,尝试了很多办法,终于解决了,下面简要的描述下在开发过程中遇到的问题. 虽然之前看过android开发的书,但是没 ...

  7. android调用系统相机并获取图片

    如果不是特别的要求,通过拍照的方式取得图片的话,我们一般调用系统的拍照来完成这项工作,而没必要再自己去实现一个拍照功能.调用系统相机很简单,只需要一个intent就可以跳转到相几界面,然后再通过onA ...

  8. Android 调用系统照相机拍照和录像

    本文实现android系统照相机的调用来拍照 项目的布局相当简单,只有一个Button: <RelativeLayout xmlns:android="http://schemas.a ...

  9. (转)Android调用系统自带的文件管理器进行文件选择并获得路径

    Android区别于iOS的沙盒模式,可以通过文件浏览器浏览本地的存储器.Android API也提供了相应的接口. 基本思路,先通过Android API调用系统自带的文件浏览器选取文件获得URI, ...

随机推荐

  1. Windows系统的安装

    一.写在前面        笔者最近因为换工作,在家待业甚感无聊,于是想要整理一些在Windows系统的一些安装方法和下载资源,一来给自己做个备忘,二来把一些不成熟的想法分享出去,希望大家予以指正. ...

  2. blog开篇

    本来是写java学习开篇的,现在就把它改为博客开篇吧. 其实一直都想着记录一下自己学习的过程,或者说是借口,一直在忙,也从重庆辗转到广州,又从广州辗转到天津了,又一个新阶段开始了,猴年马月都到了,哈哈 ...

  3. java web 之 BeanUtils.populate的作用

    首先,它是在org.apache.commons.beanutils.BeanUtils包中的一个方法. 方法的作用:用来将一些 key-value 的值(例如 hashmap)映射到 bean 中的 ...

  4. for之Python vs C#

    class test(object): def rangetest(self): for i in range(2,0,-1): print i print i i=2 while i>0: p ...

  5. Get a handle on PHP Handlers

    PHP Handlers? mod_php? FPM? How do we make sense of the inner workings of PHP outside of our lines o ...

  6. 小米4c刷机

    [测评] 试用小米4c最新波兰开发版 http://www.miui.com/thread-3048163-1-1.html [教程] 小米4C刷第三方recovery 以及ROOT教程 http:/ ...

  7. 在vim保存时获得sudo权限

    在维护线上服务的时候,经常要编辑一些不属于操作用户的文件,比如只有r权限的文件,每次保存都会提示read only.这时可以使用如下命令代替原有的 :wq 命令 :w !sudo tee % 命令:w ...

  8. sshd被攻击的自动防御方法v2

      1.增加了“频繁攻击的封锁时间”,即设置为上次攻击时间的2倍 2.加入了数据库支持,将攻击者相关信息记录入库,如攻击者ip.攻击次数.封锁时间 3.简化了代码   具体实现步骤如下:   1.创建 ...

  9. jquery.lazyload.js图片延迟加载(懒加载)--转载

    一.插件介绍 jquery.lazyload.js 是一个用 JavaScript 编写的jQuery 插件. 它可以延迟加载长页面中的图片. 在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动 ...

  10. Matlab.NET混编技巧之——找出Matlab内置函数

    原文 http://www.cnblogs.com/asxinyu/p/3295309.html Matlab与.NET的混合编程,掌握了基本过程,加上一定的开发经验和算法基础,肯 定不难.反之,有时 ...