1.手机上联系人数据库文件(contact2.db)存放目录:/data/data/com.android.providers.contacts

2.联系人源码位于工程目录:packages\apps\Contacts

3.数据库中一堆表,但常用这些表:data、phone_lookup、contacts、raw_contacts

@ContactsDatabaseHelper.java

public interface Tables {public static final String CONTACTS = "contacts";public static final String DELETED_CONTACTS = "deleted_contacts";public static final String RAW_CONTACTS = "raw_contacts";public static final String STREAM_ITEMS = "stream_items";public static final String STREAM_ITEM_PHOTOS = "stream_item_photos";public static final String PHOTO_FILES = "photo_files";public static final String PACKAGES = "packages";public static final String MIMETYPES = "mimetypes";public static final String PHONE_LOOKUP = "phone_lookup";public static final String NAME_LOOKUP = "name_lookup";public static final String AGGREGATION_EXCEPTIONS = "agg_exceptions";public static final String SETTINGS = "settings";public static final String DATA = "data";public static final String GROUPS = "groups";public static final String PRESENCE = "presence";public static final String AGGREGATED_PRESENCE = "agg_presence";public static final String NICKNAME_LOOKUP = "nickname_lookup";public static final String CALLS = "calls";public static final String CALLS_SYNC = "calls_sync";public static final String STATUS_UPDATES = "status_updates";public static final String PROPERTIES = "properties";public static final String ACCOUNTS = "accounts";public static final String VISIBLE_CONTACTS = "visible_contacts";public static final String DIRECTORIES = "directories";public static final String DEFAULT_DIRECTORY = "default_directory";public static final String SEARCH_INDEX = "search_index";public static final String VOICEMAIL_STATUS = "voicemail_status";//add by lumospublic static final String GROUP_LOOKUP = "group_lookup";public static final String SPAM_ADDRESS = "spam_address";public static final String SPEED_DIAL = "speed_dial";// This list of tables contains auto-incremented sequences.public static final String[] SEQUENCE_TABLES = new String[] {CONTACTS,RAW_CONTACTS,STREAM_ITEMS,STREAM_ITEM_PHOTOS,PHOTO_FILES,DATA,GROUPS,CALLS,DIRECTORIES};

4.查询时使用Phone.CONTENT_URI会关联查询多张表(contacts、raw_contacts、data?详情查看源码ContactsProvider2.java) ,返回的结果中已经包含了很多信息,如联系人姓名、电话号码等,基本可以满足一般需求

@ContactsProvider2.java

matcher.addURI(ContactsContract.AUTHORITY, "data/phones", PHONES)

5.代码实现(异步加载使用rxjava)

权限申请:<uses-permission android:name="android.permission.READ_CONTACTS"/>

远程库依赖: compile 'io.reactivex:rxandroid:1.1.0'
    compile 'io.reactivex:rxjava:1.1.0'

package com.example.lance.contactdbtest;import android.app.ListActivity;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;import java.util.ArrayList;
import java.util.List;import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;public class MainActivity extends ListActivity {MyAdapter adapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//setContentView(R.layout.activity_main);adapter = new MyAdapter();getListView().setAdapter(adapter);Observable.create(new Observable.OnSubscribe<List<Contact>>() {@Overridepublic void call(Subscriber<? super List<Contact>> subscriber) {try {Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, new String[]{ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME_PRIMARY, ContactsContract.CommonDataKinds.Phone.NUMBER}, null, null, null);if(cursor != null){int nameId = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME_PRIMARY);int numberId = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);List<Contact> contacts = new ArrayList<Contact>();while (cursor.moveToNext()){Contact contact = new Contact();contact.name = cursor.getString(nameId);contact.number = cursor.getString(numberId);contacts.add(contact);}subscriber.onNext(contacts);subscriber.onCompleted();}} catch (Exception e) {if (subscriber.isUnsubscribed()) {//refuse to emit onError if already unsubscribedreturn;}subscriber.onError(e);}}}).subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber<List<Contact>>() {@Overridepublic void onCompleted() {Log.i("test", "onCompleted");}@Overridepublic void onError(Throwable e) {Log.e("test", "onError");e.printStackTrace();}@Overridepublic void onNext(List<Contact> contacts) {adapter.addAll(contacts);}});}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.menu_main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();//noinspection SimplifiableIfStatementif (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);}class MyAdapter extends BaseAdapter {List<Contact> mContacts = new ArrayList<>();public void addAll(List<Contact> contacts){mContacts.addAll(contacts);notifyDataSetChanged();}@Overridepublic int getCount() {return mContacts.size();}@Overridepublic Object getItem(int i) {return i;}@Overridepublic long getItemId(int i) {return i;}@Overridepublic View getView(int i, View view, ViewGroup viewGroup) {View holder = view;if(holder == null){holder = getLayoutInflater().inflate(R.layout.list_item, viewGroup, false);}Contact contact = mContacts.get(i);if(contact != null) {((TextView) holder.findViewById(R.id.name)).setText(contact.name);((TextView) holder.findViewById(R.id.number)).setText(contact.number);}return holder;}}class Contact{String name;String number;}
}

Android简单获取手机联系人姓名电话号码相关推荐

  1. android 获取phone实例,Android ContentProvider获取手机联系人实例

    在做项目的时候,因为要用到我们自动获取联系人的姓名和电话,就想到了ContentProvider分享数据的功能,这样做既节省了时间,也减少了我们输入错误号码的几率,所以,想在这里把小demo分享给大家 ...

  2. Android Studio 获取手机联系人并进行,发短信,打电话,增删改操作

    1.总体设计 我的整体功能设计相对简单.一个主要的联系人显示界面,使用ListView将得到联系人数据进行显示,通过点击,长按联系人事件触发相应的弹窗(Dailog)然后选择想要的功能.通过点击加号图 ...

  3. android 使用内容提供者获取手机联系人

    最近在学习安卓的相关内容, 正好在写获取手机联系人的程序, 就想到了内容提供者, 这里有几点需要注意, 写到这里, 以后方便自己查询. 1. 手机联系人的数据库是存储在 data/data/com.a ...

  4. Android获取手机联系人匹配用户表并按字母A Z排序展示

    1.前言 最近在做公司项目的时候遇到一个添加手机联系人的需求,主要有以下几个功能点: 读取联系人:读取用户手机上的通讯录里的联系人列表 好友排序:按照拼音顺序对好友进行排序,兼容英文数字符号等 字母索 ...

  5. android的contentResolver,contentProvider简介(附带个获取手机联系人及头像实例)

    介绍 android中有个ContentProvider(内容提供者)还有个ContentResolver(内容解析者) 简单来说,contentProvider就是将自己app的数据库共享,使得其他 ...

  6. Android中获取手机中的联系人信息

    #Android中获取手机中的联系人信息 1.0.查看系统通讯录的表,表路径:data->data->com.android.providers.contacts->database ...

  7. 获取手机联系人的两种方法

    获取手机联系人的两种方法 第一种方法比较简单 就几句话 但是获取的信息不完善 第二种方法比较难 代码比较多 获取的信息全 须要加的权限 : <uses-permission android:na ...

  8. android获取机主手机号,Android中 获取手机通讯录和手机机主手机号码——诺诺涂鸦记忆...

    目标:获取手机通讯录联系人的姓名和手机号码,屏幕座机和其他非手机号码,避免号码重复 (注:我只给出了代码思路和用法示例,大家可以自己调用方法debug运行看结果或者自行编写显示结果的代码,根据需要进行 ...

  9. 手机联系人姓名或号码过长无法导入到SIM卡

     手机联系人姓名或号码过长无法导入到SIM卡 [DESCRIPTION] 1. 手机联系人姓名较长:  2. 将此联系人复制到sim卡:  [结果] 提示导入失败  [期望] 导入成功,自动剪切联系人 ...

最新文章

  1. 【 MATLAB 】信号处理工具箱之波形产生函数 tripuls
  2. 实例教程五:采用SharedPreferences保存用户偏好设置参数
  3. 伤害世界怎么自建服务器,Hurtworld伤害世界服务器怎么架设?服务器架设图文教程...
  4. python版本及ML库
  5. Event and Delegate
  6. python给函数添加属性_如何在python中自动向类添加属性?
  7. AWS re:Invent大会回顾
  8. 七牛底层架构再完善 让服务从单一走向多元
  9. JQueryDOM之CSS操作
  10. 负载均衡之让nginx跑起来
  11. php tp框架,tp框架是什么意思
  12. 百度地图点聚合,加载1万个marker
  13. php在线拍照代码,基于jQuery+PHP在线拍照
  14. 小常识:软件常见的各种版本英文缩写
  15. 微信特殊字符php,PHP方法处理微信昵称特殊符号过滤
  16. 树莓派——TSL2561获取光强数值(C语言)
  17. Mac如何读写NTFS硬盘,NTFSTool让Mac也可以轻松读写NTFS硬盘
  18. C语言学习笔记-P1 初识C语言(1)
  19. fx3g485通讯模块_三菱模块FX3U-485ADP-MB MODBUS通信模块
  20. 如何基于Python写一个TCP反向连接后门

热门文章

  1. Z-Score模型的进阶版:Zeta模型
  2. 什么是站内SEO优化(应该怎么做)
  3. Linux作业 北京各监测站的PM2.5浓度
  4. Non-local U-Nets for Biomedical Image Segmentation
  5. 卧加刀库回参考点_840D卧加回装后刀库如何设置
  6. 上国会中外合作办学金融EMBA课程 |魔鬼在细节里——《财务报告与价值分析》课程报道
  7. pap认证失败_PAP_在以下的认证方式中,最不安全的是()
  8. anki for android,Anki-Android
  9. Python实现抖音关键词热度搜索小程序(附源码)
  10. 关于凸函数中的Hadamard定理引发的思考