实现读取手机中所有联系人的主要信息(名称和联系电话),并以ListView显示

1. Contact API的结构和使用方法

  自Android 2.0(API Level 5)开始,Android平台采用了改进后的Contacts API- ContactsContract,用于管理和集成来自多账户和多数据来源的联系人信息。

  在新的Contacts API中,联系人数据被安排三个主要的表中:contacts, raw contacts and data. 结构如下图所示:

 

                   (图片来源于:developer.android.com)

  1) Contact 表中的一行记录代表一个联系人的总体信息

  2) RawContact表的一行记录用于关联联系人和一个特定的联系人信息来源。因为有可能手机的联系人信息是来源于Gmail,Facebook等其它地方,为互相区别并方便同步,特引入RawContact概念。

  3) Data表:储存所有具体的信息,如:电话,email地址, 头像等。表的每一条记录对应一个RawContact的一个具体信息。

  总的来说就是:一个contact(联系人)记录关联一个或多个RawContact(联系人来源)记录,每个RawContact记录又关联多个data(email, phone number等等)记录。

  参考1:http://developer.android.com/resources/articles/contacts.html 

  参考2:http://www.haoni.org/2011/04/15/androidcontactscontractyanjiu/

2. ContentProvider组件作用,URI概念及使用方法

  在Android中,应用程序之间是相互独立的,分别运行在自己的进程中。如果应用程序之间想互相共享数据怎么办?比如,当我们发送一条短信时,可能要用到联系人应用程序,从中选择要接受短信的人。在这种情况下,Android提供了应用程序之间互相访问的统一接口,这些接口被定义在ContentProvider中,其中包括增,删,查,改等操作。

  我们在ContentProvider中实现我们实际操作数据的方法。但调用时,我们将使用另外一个接口:ContentResolver。ContentResolver提供了和ContentProvider对应的方法。我们是间接地通过ContentResolver来操作ContentProvider的。ContentResolver可以通过getContentResolver()方法获得。

  URI的讲解: 可以参考http://www.cnblogs.com/thomas-lee/archive/2011/04/16/Android3.html 的相关部分以及官方文档上的相关部分,比如:

http://developer.android.com/guide/topics/providers/content-providers.html#creating中的最后一部分。

TextUtils

  这部分参考:《Android应用开发详解》 郭宏志,电子工业出版社

3.  创建ListView,并绑定数据

  参考:http://developer.android.com/resources/tutorials/views/hello-listview.html

4. 最终代码如下:

package com.memo;
import java.util.ArrayList;
import android.app.ListActivity;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class Main extends ListActivity {
   
   
/** Called when the activity is first created. */
    @Override
   
public void onCreate(Bundle savedInstanceState) {
       
super .onCreate(savedInstanceState);
       
        Uri contactsUri
= ContactsContract.Contacts.CONTENT_URI;
        String[] proj1
= new String[]{ContactsContract.Contacts.DISPLAY_NAME,
                                    ContactsContract.Contacts.HAS_PHONE_NUMBER,
                                    ContactsContract.Contacts.LOOKUP_KEY};
        Cursor curContacts
= getContentResolver().query(contactsUri,proj1, null , null , null );
          
       
// declare a ArrayList object to store the data that will present to the user
        ArrayList < String > contactsList = new ArrayList < String > ();
        String allPhoneNo
= "" ;
       
if (curContacts.getCount() > 0 ){
           
while (curContacts.moveToNext()){  
               
// get all the phone numbers if exist
                if (curContacts.getInt( 1 ) > 0 ){
                    allPhoneNo
= getAllPhoneNumbers(curContacts.getString( 2 ));
                }
                contactsList.add(curContacts.getString(
0 ) + " , " + allPhoneNo);
                allPhoneNo
= "" ;
            }
        }
  
       
// binding the data to ListView
        setListAdapter( new ArrayAdapter < String > ( this ,android.R.layout.simple_list_item_1, contactsList));
        ListView lv
= getListView();
        lv.setTextFilterEnabled(
true );
       
    }
   
   
/**
     * Get all the phone numbers of a specific contact person
     *
     *
@param lookUp_Key lookUp key for a specific contact
     *
@return a string containing all the phone numbers
    
*/
   
public String getAllPhoneNumbers(String lookUp_Key){
        String allPhoneNo
= "" ;
       
       
// Phone info are stored in the ContactsContract.Data table
        Uri phoneUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
        String[] proj2
= {ContactsContract.CommonDataKinds.Phone.NUMBER};
       
// using lookUp key to search the phone numbers
        String selection = ContactsContract.Data.LOOKUP_KEY + " =? " ;
        String[] selectionArgs
= {lookUp_Key};
        Cursor cur
= getContentResolver().query(phoneUri,proj2,selection, selectionArgs, null );
       
while (cur.moveToNext()){
            allPhoneNo
+= cur.getString( 0 ) + " " ;
        }

       
return allPhoneNo;
       
    }
   
 

}

5. 注意事项:

  1)由于要读取联系人信息,所以必须在AndroidMenifest.xml里加入相关uses-permission用于请求使用许可:

      <uses-permission android:name="android.permission.READ_CONTACTS" />

      参考1:http://developer.android.com/guide/topics/security/security.html

      参考2:http://www.higherpass.com/Android/Tutorials/Working-With-Android-Contacts/

  2) 怎样获取特定联系人的电话号码?由于使用新的API,所以编写方法与使用旧的API不同。

      在查询是主要使用到lookUp key 的概念。

      参考:http://stackoverflow.com/questions/4729551/contactscontract-lookup-phone-number-by-contact-id

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
|--Activity不允许横竖屏切换 |--Activity常用小技巧 |--Activity按返回直接回到桌面 |--aidl之结合反射获取应用缓存大小等空间占用 |--aidl调用系统service未公开的方法挂电话 |--aidl调用系统未公开的方法代码示例2 |--android dp和px之间转换 |--android INSTALL_PARSE_FAILED_MANIFEST_MALFORMED |--android root下禁用组件 |--android 判断网络状态 |--android 对话框样式 |--android 开机启动 |--android 挪动dialog的位置 |--android 控制对话框位置 |--android 根据uri获取路径 |--android 模拟器错误 |--android 横竖屏切换 |--android 获取mac地址 |--android 获取sd卡状态 |--android 设置apn |--android 调节屏幕亮度 |--android 资源uri |--android 还原短信 |--android 重启 |--androidanim文件特效 |--app信息menifest获取(如版本号) |--AsyncQueryHandler之异步查询Cursor处理 |--AutoCompleteTextView自动提示的用法 |--BitMap、Drawable、inputStream及byte[] 互转 |--ContentProvider内容提供者定义 |--DatePicker日期控件 |--desktop |--Dialog之位置的挪动与控制 |--Dialog实现无标提栏及自定义风格 |--Dialog风格Activity的作法 |--ExpandableListView(下拉伸缩ListView) |--GridView表格布局的用法 |--httpclient超时 |--info体系 |--Intent启动应用apk安装 |--Intent常用功能 |--IO将输入流转成字节 |--Json读js资源文件 |--layout布局样式之style配置 |--listview 页面 图片加文字 |--ListView之CursorAdapter异步查询框架之短信 |--ListView之动态添加子view |--ListView优化之分页加载 |--ListView优化之动态加载 |--ListView优化之控制getView实现复杂显示 |--ListView优化之标准写法 |--listview老虎机 界面设计 水果机 |--listview页面跳转 数据库交互 事务 dao biz 层 |--Log的收集 |--Manager下的info |--Manager之ActivityManager进程管理 |--Manager之LocationManager |--Manager之PackageManager |--Menu之不同模式下显示不同菜单 |--openGL-ES上绘制文字 |--openGL-ES纹理贴图 |--openGL-ES获取帧率 |--openGL-ES雾化 |--PopupWindow的使用 |--PopupWindow的返回健关闭 |--RadioGroup的用法(里面的成员可以是任何view) |--SD卡之计算剩余空间 |--Spinner下拉菜单组件 |--SplashActivity |--StringUtils工具类的常用方法 |--TabHost一个界面显示多Activity |--TextView单行跑马灯效果 |--TextView虚拟获得焦点 |--uploadServlet |--uri之表示资源resource |--ViewPage的使用 |--view的tag用法之存储对象 |--view常用属性 |--xml常用属性 |--xml文件的pull解析与序列化写入 |--xml的封装序列化 |--任务循环之只在Activity显示时执行 |--修改文件的最后修改时间 |--偏好设置(回显) |--内存优化之各种方法 |--内容提供者之短信的序列化对象读写 |--内容提供者之短信的获取与写入 |--内容提供者之联系人读写与批量操作 |--内容提供者之获取通话记录 |--内容提供者的定义 |--写入联系人信息 |--利用FinalHttp实现多线程断点续传 |--加密之MD5 |--动画Animation详解 |--动画之view左右抖动 |--动画之移动动画 |--动画之组合动画 |--动画之缩放动画ScaleAnimation |--反序列化对象 |--发送短信 读天气 调音量 |--回调函数的定义 |--图片之BitMap、Drawable、inputStream及byte[] 互转 |--图片之保存图片至SD卡 |--图片之删除40%最近没有被使用的 |--图片之的本地缓存至SD卡 |--图片之网络异步下载图片 |--图片之获取SD卡所有及边界可调及压缩和软引用和内存回收 |--图片的LRU算法内存保存和读取 |--图片的缩放处理(防内存溢出) |--多媒体应用设计图 |--多线程下载 |--多线程下载及断点续传 |--多线程之AsyncTask的用法 |--多线程之线程池ExecutorService |--字体为粗体 |--安卓下的多线程断点上传 |--对话框与进度条结合用法 |--屏幕之Activity全屏 |--屏幕之横竖屏切换 |--屏幕之调节屏幕亮度 |--屏幕相关之Display类获取屏幕尺寸和分辨率 |--屏幕适配之ScrollView |--屏幕适配之像素dp和px之间转换 |--工具类之Log的封装类 |--工具类之不同log打印的封装 |--工具类之开启新的Activity |--布局加载器的获取 |--广播接收者之开机启动 |--广播接收者之获取管理员权限 |--广播接收者代码注册与卸载 |--广播接收者常用广播的获取 |--应用之分享(隐式意图) |--应用之卸载(隐式意图) |--应用之安装(隐式意图) |--应用之完美退出 |--应用之获取名称和图标 |--应用之获得占用内存大小 |--应用之通过包名开启一个应用 |--应用之隐式意图开启设置界面 |--应用启动之检查版本更新及初始化 |--延时任务的工具类 |--异常之UncaughtExceptionHandler全局捕获处理 |--异步任务AsyncTask的用法 |--异步任务的自定义 |--快捷方式增删查 |--手势识别器GestureDetector的用法 |--拍照之调用系统相机并显示及保存 |--拨打电话 |--按健之长按menu事件屏蔽 |--按健监听按返回健回桌面 |--搜索之调用系统Searchable的用法 |--数据库CURD通过execSQL与rawQuery |--数据库SQLiteOpenHelper标准写法 |--数据库复杂多表查询 |--数据库查询之归属地 |--数据库直接CURD |--数据提交无需权限 |--文件之从服务器下载 |--文件之拷贝文件至某个目录 |--文件之指定编码读写文件 |--文件之释放Assets下的文件到应用的File目录 |--文件之随机存储RandomAccessFile |--文件使用时间排序 |--文件复制粘贴 |--文件路径之通过uri获取 |--时间java常用应用 |--时间之handle记时器 |--时间之time的用法得到特定时间的long值 |--时间之之定时任务TimerTask |--时间之倒计时CountDownTimer |--时间之当前时间动态显示 |--时间之自动任务ScheduledExecutorService |--时间之记时器 |--时间日期格式化 |--服务之判断是否处于运行状态 |--服务之定义录音机 |--服务之应用内绑定服务调用方法 |--服务之电话录音 |--服务之看门狗代码示例 |--格式化之DecimalFormat数字格式化 |--桌面快捷方式的添加代码示例 |--桌面控件widget的创建方法 |--模拟发短信 指定号码 短信窃听提示 |--消息机制 mesage looper |--滑动之左右滑动的两种定义 |--电话簿读取联系人信息 |--监听 |--监听之CheckBox是否选监听 |--监听之EditText内容变化监听 |--监听之GridView条目点击监听 |--监听之ListView条目点击事件监听 |--监听之ListView滑动监听 |--监听之单击监听的两种定义 |--监听之双击监听 |--监听之电话状态监听 |--监听之触摸监听 |--短信之根据id删除及查询短信 |--短信发送小demo |--短信的截取 |--系统之SD卡清理 |--系统之获取所有开机启动应用 |--系统之重启实现 |--系统信息之获取SD卡内存信息 |--系统信息之获取动态内存RAM信息 |--系统信息之获取可用内存 |--系统信息之获得mac地址 |--系统信息之获得手机sim卡序列号 |--缓存优化之几种方案lastModified |--缓存优化之本地缓存优化(超过规定值或SD卡容量不够时) |--网络post提交查询请求 |--网络之HttpClient的get和post用法 |--网络之判断网络状态是否可用 |--网络之设置apn |--网络图片查看器 |--网络图片的下载与缓存 |--网络文件的下载与关联进度条 |--联系人之各种查找 |--联系人读写与批量操作 |--联系人读取 |--自定义shape形状颜色渐变资源 |--自定义Toast |--自定义view的属性 |--自定义下拉刷新ListView |--自定义动画资源 |--自定义常用小控件 |--自定义控件之小技巧 |--自定义控件风格和全局背景 |--自定义组合控件 |--自定义配置文件资源 |--自定义颜色状态选择资源 |--自定义颜色资源 |--获取网页的源码 |--读取外部资源的文件3种方式 |--读取手机内的短信 |--通信之Application实现应用全局通信 |--重启adb |--隐式转换 页面 |--震动效果的实现
App相关→AppUtils.java 安装App installApp 卸载指定包名的App uninstallApp 获取当前App信息 getAppInfo 获取所有已安装App信息 getAllAppsInfo 根据包名判断App是否安装 isInstallApp 打开指定包名的App openAppByPackageName 打开指定包名的App应用信息界面 openAppInfo 可用来做App信息分享 shareAppInfo 判断当前App处于前台还是后台 isAppBackground 常量相关→ConstUtils.java 存储相关常量 时间相关常量 正则相关常量 转换相关→ConvertUtils.java→Test 每1个byte转为2个hex字符 bytes2HexString 每2个hex字符转为1个byte hexString2Bytes charArr转byteArr chars2Bytes byteArr转charArr bytes2Chars 设备相关→DeviceUtils.java 获取设备MAC地址 getMacAddress 获取设备厂商,如Xiaomi getManufacturer 获取设备型号,如MI2SC getModel 编码解码相关→EncodeUtils.java→Test URL编码 urlEncode URL解码 urlDecode Base64编码 base64Encode base64Encode2String Base64解码 base64Decode Base64URL安全编码 base64UrlSafeEncode Html编码 htmlEncode Html解码 htmlDecode 加密解密相关→EncryptUtils.java→Test MD2加密 encryptMD2ToString encryptMD2 MD5加密 encryptMD5ToString encryptMD5 SHA1加密 encryptSHA1ToString encryptSHA1 SHA224加密 encryptSHA224ToString encryptSHA224 SHA256加密 encryptSHA256ToString encryptSHA256 SHA384加密 encryptSHA384ToString encryptSHA384 SHA512加密 encryptSHA512ToString encryptSHA512 获取文件的MD5校验码 encryptMD5File2String encryptMD5File DES加密后转为Base64编码 encryptDES2Base64 DES加密后转为16进制 encryptDES2HexString DES加密 encryptDES DES解密Base64编码密文 decryptBase64DES DES解密16进制密文 decryptHexStringDES DES解密 decryptDES 3DES加密后转为Base64编码 encrypt3DES2Base64 3DES加密后转为16进制 encrypt3DES2HexString 3DES加密 encrypt3DES 3DES解密Base64编码密文 decryptBase64_3DES 3DES解密16进制密文 decryptHexString3DES 3DES解密 decrypt3DES AES加密后转为Base64编码 encryptAES2Base64 AES加密后转为16进制 encryptAES2HexString AES加密 encryptAES AES解密Base64编码密文 decryptBase64AES AES解密16进制密文 decryptHexStringAES AES解密 decryptAES 文件相关→FileUtils.java→Test 根据文件路径获取文件 getFileByPath 判断文件是否存在 isFileExists 判断是否是目录 isDir 判断是否是文件 isFile 判断目录是否存在,不存在则判断是否创建成功 createOrExistsDir 判断文件是否存在,不存在则判断是否创建成功 createOrExistsFile 判断文件是否存在,存在则在创建之前删除 createFileByDeleteOldFile 复制目录 copyDir 复制文件 copyFile 移动目录 moveDir 移动文件 moveFile 删除目录 deleteDir 删除文件 deleteFile 获取目录下所有文件 listFilesInDir 获取目录下所有文件包括子目录 listFilesIn
视频名称 源码 -------------------------------------------------------------------------------- 04_开发与运行(卸载)第一个ANDROID应用.avi 所在项目:Hello 06_电话拔号器.avi 所在项目:phone 08_短信发送器.avi 所在项目:sms 09_深入了解各种布局技术.avi 所在项目:sms & FrameLayout 10_对应用进行单元测试.avi 所在项目:junitest 11_查看与输出日志信息.avi 所在项目:junitest 12_文件的保存与读取.avi 所在项目:File 13_文件的操作模式.avi 所在项目:File & other 14_把文件存放在SDCard.avi 所在项目:File 15_采用Pull解析器解析和生成XML内容.avi 所在项目:xml 16_采用SharedPreferences保存用户偏好设置参数.avi 所在项目:SharedPreferences 17_创建数据库与完成数据添删改查.avi 所在项目:db 18_在SQLite使用事务.avi 所在项目:db 19_采用ListView实现数据列表显示.avi 所在项目:db 20_采用ContentProvider对外共享数据.avi 所在项目:db & other 21_监听ContentProvider数据的变化.avi 所在项目:db & other & Aapp 22_访问通信录联系人和添加联系人.avi 所在项目:contacts 23_网络通信之网络图片查看器.avi 所在项目:netimage & Web端应用:web 24_网络通信之网页源码查看器.avi 所在项目:HtmlViewer & Web端应用:web 25_网络通信之视频资讯客户端.avi 所在项目:news & Web端应用:web 26_采用JSON格式返回数据给资讯客户端.avi 所在项目:news & Web端应用:web 27_网络通信之通过GET和POST方式提交参数给web应用.avi 所在项目:newsmanage & Web端应用:web 28_网络通信之通过HTTP协议实现文件上传.avi 所在项目:newsmanage & Web端应用:web 29_发送xml数据和调用webservice.avi 所在项目:mobileAddressQuery & Web端应用:web 30_多线程下载原理.avi 所在项目:net 31_多线程断点下载器.avi 所在项目:MulThreadDownloader 32_文件断点上传器.avi 所在项目:videoUpload & javaSE应用:socket 33_为应用添加多个Activity与参数传递.avi 所在项目:MulActivity 34_Activity的启动模式.avi 所在项目:LaunchMode & openSingleInstance & singleInstance 35_Intent深入解剖.avi 所在项目:Intent 36_Activity生命周期.avi 所在项目:ActivityLife 37_采用广播接收者实现短信窃听器.avi 所在项目:SMSListener & Web端应用:web 38_采用广播接收者拦截外拔电话与其特性.avi 所在项目:SMSListener 39_采用Service实现电话窃听器.avi 所在项目:phonelistener 40_建立能与访问者进行相互通信的本地服务.avi 所在项目:studentquery 41_使用AIDL实现进程通信.avi 所在项目:remoteService & remoteServiceClient 42_服务的生命周期.avi 43_音乐播放器.avi 所在项目:audioplayer 44_在线视频播放器.avi 所在项目:videoplayer 45_拍照.avi 所在项目:takepicture 46_视频刻录.avi 所在项目:videoRecorder 47_手势识别.avi 所在项目:gesture & GestureBuilder 48_实现软件国际化.avi 所在项目:i18n 49_屏幕适配.avi 所在项目:ScreenAdapter 50_样式与主题.avi 所在项目:style 51_编码实现软件界面.avi 所在项目:codeUI 52_发送状态栏通知.avi 所在项目:Notification 53_采用网页设计软件界面.avi 所在项目:htmlUI 54_tween动画.avi 所在项目:tween 55_frame动画的实现.avi 所在项目:frameAnimation 56_activity切换动画与页面切换动画.avi 所在项目:animation 57_采用方向传感器实现指南针.avi 所在项目:sensor 58_拖拉功能与多点触摸.avi 所在项目:DragScale 59_各种图形的使用介绍.avi 所在项目:drawable 60_meta-data的使用.avi 所在项目:metadata 61_Widget.avi 所在项目:Widgets 62_自定义窗口标题.avi 所在项目:customtitle 63_PopupWindow.avi 所在项目:PopupWindow 64_ListView数据异步加载与AsyncTask.avi 所在项目:DataAsyncLoad 65_ListView数据的分批加载.avi 所在项目:datapageload 66_自定义标签页.avi 所在项目:tabhost

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值