android读取联系人的两种方式
2015-12-26 22:55
465 查看
随着android开发的升入,虽然代码功力提升了不少,但是我们却忘记了在以后的android开发中为了开发的方便却一直引用别人的框架,虽然可以省去很多调试的BUG,但是我个人觉得一步一个脚印,慢慢的提升自己。
那直接进入主题,我们知道读取联系人需要权限:
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
读取联系人信息都是从手机数据库中加载获取信息。方法是[b]查询数据库表中的三个字段raw_contacts, data, mimetypes来获取联系人信息,[/b]下面是通过两种方法获取联系人信息:
方法一:
1. 先从raw_contacts中读取联系人的contact_id
2. 根据contact_id,从data中查出联系人相关信息
3. 根据mimetype_id, 查询mimetype表,得到信息类型(名称,号码)
代码如下:
最近在研究android源码,个人觉得源码才是android最基础,而且是精髓;通过查询源码我又得到了另外一种方法,而且很简单快捷,我是通过按键点击显示一个dialog的方式把联系人信息显示在dialog的内容框中。代码如下:
<span style="font-size:14px;">private String contactId;
private Cursor cursor;
String[] projection = new String[] {
ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts.SEND_TO_VOICEMAIL
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(new Runnable() {
@Override
public void run() {
cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,
projection, null, null, null);
}
}).start();
}
public void click(View view){
AlertDialog.Builder builder = new Builder(this);
builder.setTitle("联系人列表");
builder.setMultiChoiceItems(cursor, ContactsContract.Contacts.SEND_TO_VOICEMAIL,
ContactsContract.Contacts.DISPLAY_NAME,</span>
那直接进入主题,我们知道读取联系人需要权限:
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
读取联系人信息都是从手机数据库中加载获取信息。方法是[b]查询数据库表中的三个字段raw_contacts, data, mimetypes来获取联系人信息,[/b]下面是通过两种方法获取联系人信息:
方法一:
1. 先从raw_contacts中读取联系人的contact_id
2. 根据contact_id,从data中查出联系人相关信息
3. 根据mimetype_id, 查询mimetype表,得到信息类型(名称,号码)
代码如下:
private ArrayList<HashMap<String, String>> readContact(){ // raw_contacts, data, mimetypes // 1. 先从raw_contacts中读取联系人的contact_id // 2. 根据contact_id,从data中查出联系人相关信息 // 3. 根据mimetype_id, 查询mimetype表,得到信息类型(名称,号码) Cursor rawContactCursor = getContentResolver().query( Uri.parse("content://com.android.contacts/raw_contacts"), new String[] { "contact_id" }, null, null, null); ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();// 所有联系人集合 while(rawContactCursor.moveToNext()){// 遍历所有联系人 contactId = rawContactCursor.getString(0); // 系统查询的不是data这个表,而是view_data这个视图,视图是多个表的整合, data+mimetypes Cursor dataCursor = getContentResolver().query( Uri.parse("content://com.android.contacts/data"), new String[] { "data1", "mimetype" }, "raw_contact_id=?", new String[] { contactId }, null); HashMap<String, String> map = new HashMap<String, String>();// 保存某个联系人的信息 while (dataCursor.moveToNext()) {// 遍历单个联系人所有字段信息 String data = dataCursor.getString(0); String type = dataCursor.getString(1); if ("vnd.android.cursor.item/phone_v2".equals(type)) { // 电话号码 map.put("phone", data); } else if ("vnd.android.cursor.item/name".equals(type)) { // 名称 map.put("name", data); } } dataCursor.close(); // 脏数据, 过滤掉 if (!TextUtils.isEmpty(map.get("name")) && !TextUtils.isEmpty(map.get("phone"))) { list.add(map); } } rawContactCursor.close(); return list; } }方法二:
最近在研究android源码,个人觉得源码才是android最基础,而且是精髓;通过查询源码我又得到了另外一种方法,而且很简单快捷,我是通过按键点击显示一个dialog的方式把联系人信息显示在dialog的内容框中。代码如下:
<span style="font-size:14px;">private String contactId;
private Cursor cursor;
String[] projection = new String[] {
ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts.SEND_TO_VOICEMAIL
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(new Runnable() {
@Override
public void run() {
cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,
projection, null, null, null);
}
}).start();
}
public void click(View view){
AlertDialog.Builder builder = new Builder(this);
builder.setTitle("联系人列表");
builder.setMultiChoiceItems(cursor, ContactsContract.Contacts.SEND_TO_VOICEMAIL,
ContactsContract.Contacts.DISPLAY_NAME,</span>
<span style="font-size:14px;"><span style="white-space: pre;"> </span>new OnMultiChoiceClickListener() { <span style="white-space: pre;"> </span>@Override public void onClick(DialogInterface dialog, int which, boolean isChecked) { Toast.makeText(getApplicationContext(), "选择:"+which, 1).show(); } }); builder.setPositiveButton("确定", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.setNegativeButton("取消", null); builder.create().show(); }</span>
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories