Android通讯录管理一之联系人获取

正如我们知道的一样,Android的通讯录和短信管理是通过contentprovider来向开发者来开发接口的。必须从ContentResolver入手去解决。其中通讯录操作涉及到系统源码api的使用,特别是在表的uri上面容易弄混。在接下来的几篇文章中蜗牛将陆续为大家推出Android通讯管理相关知识的文章。其中包括联系人获取、通话记录获取、短信获取、短信详情获取发送短信。废话不多说先上图

先看看联系人的表的结构

其中对于开发这来说主要关注以上三个表,其中要用到联合查询,关于三张表的设计可以百度到相关文章。

代码最终效果图

联系人:

想要源码的童鞋可以在下载http://download.csdn.net/detail/waniu123/8554533;

package cn.zxw.contact.domain;

/**
 * 联系人
 * @author zhan
 *
 */
public class ContactsInfo {
	public int _id;
	public String name;
	public String phone;
	public String email;
	public ContactsInfo() {
		super();
	}

	public ContactsInfo(int _id, String name, String phone, String email) {
		super();
		this._id = _id;
		this.name = name;
		this.phone = phone;
		this.email = email;
	}

	@Override
	public String toString() {
		return "PersonInfo [_id=" + _id + ", name=" + name + ", phone=" + phone
				+ ", email=" + email + "]";
	}

}

获取联系人

/**
	 * 获取联系人
	 *
	 * @param context
	 * @return
	 */
	public static List<ContactsInfo> getContactsInfos(Context context) {
		ContentResolver resolver = context.getContentResolver();
		List<ContactsInfo> infos = new ArrayList<ContactsInfo>();
		// 获取联系人数据 访问联系人的内容提供者
		// ContactsContract.AUTHORITY com.android.contacts 授权
		// 该内容提供者操作是需要读写权限
		// matcher.addURI(ContactsContract.AUTHORITY, "raw_contacts",
		// RAW_CONTACTS);
		// matcher.addURI(ContactsContract.AUTHORITY, "raw_contacts/#/data",
		// RAW_CONTACTS_DATA);
		Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
		Cursor cursor1 = resolver.query(uri, new String[] { "_id" }, null,
				null, null);
		while (cursor1.moveToNext()) {
			int _id = cursor1.getInt(0);
			ContactsInfo info = new ContactsInfo();
			uri = Uri.parse("content://com.android.contacts/raw_contacts/"
					+ _id + "/data");
			Cursor cursor2 = resolver.query(uri, new String[] { "data1",
					"mimetype" }, null, null, null);
			while (cursor2.moveToNext()) {
				String data1 = cursor2.getString(0);
				String mimetype = cursor2.getString(1);
				if ("vnd.android.cursor.item/phone_v2".equals(mimetype)) {// 号码
					info.phone = data1;
				} else if ("vnd.android.cursor.item/name".equals(mimetype)) {// 姓名
					info.name = data1;
				}
			}

			cursor2.close();
			infos.add(info);
		}
		cursor1.close();

		return infos;
	}

	/**
	 * 获取所有的通话记录
	 *
	 * @param context
	 * @return
	 */
	public  List<CallLogInfo> getCallLog(Context context) {
		List<CallLogInfo> infos = new ArrayList<CallLogInfo>();
		ContentResolver cr = context.getContentResolver();
		Uri uri = Calls.CONTENT_URI;
		String[] projection = new String[] { Calls.NUMBER, Calls.DATE,
				Calls.TYPE };
		Cursor cursor = cr.query(uri, projection, null, null, null);
		while (cursor.moveToNext()) {
			String number = cursor.getString(0);
			long date = cursor.getLong(1);
			int type = cursor.getInt(2);
			infos.add(new CallLogInfo(number, date, type));
		}
		cursor.close();
		return infos;
	}
package cn.zxw.contact;

import java.util.ArrayList;

import java.util.List;

import cn.zxw.contact.domain.ContactsInfo;
import cn.zxw.contact.utils.ContactsMsgUtils;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

import android.app.Activity;

/**
 * 联系人
 *
 * @author zhan
 *
 */

public class ContactsActivity extends Activity {

	private ListView lv;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_contacts_msg_calllog);
		lv = (ListView) findViewById(R.id.lv);

		List<ContactsInfo> infos = ContactsMsgUtils
				.getContactsInfos(getApplicationContext());
		MyAdapter adapter = new MyAdapter(infos);
		lv.setAdapter(adapter);
	}

	private class MyAdapter extends BaseAdapter {
		//
		List<ContactsInfo> infos = new ArrayList<ContactsInfo>();
		private TextView tv_number;
		private TextView tv_name;

		public MyAdapter(List<ContactsInfo> infos) {
			super();
			this.infos = infos;
		}

		@Override
		public int getCount() {
			return infos.size();
		}

		@Override
		public Object getItem(int position) {
			return null;
		}

		@Override
		public long getItemId(int position) {
			return 0;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			View view = View.inflate(getApplicationContext(),
					R.layout.contacts_list_item, null);
			tv_number = (TextView) view.findViewById(R.id.tv_number);
			tv_name = (TextView) view.findViewById(R.id.tv_name);
			ContactsInfo info = infos.get(position);
			tv_number.setText(info.phone);
			tv_name.setText(info.name);
			return view;
		}

	}
}
时间: 2024-10-15 17:02:49

Android通讯录管理一之联系人获取的相关文章

Android通讯录管理(获取联系人、通话记录、短信消息)(二)

http://blog.csdn.net/wwj_748/article/details/19970271 Android通讯录管理(获取联系人.通话记录.短信消息)(二) 2014-02-26 11:40 9076人阅读 评论(11) 收藏 举报  分类: [Android通讯录模块开发](10)  版权声明:本文为博主原创文章,未经博主允许不得转载. Android通讯录管理(获取联系人.通话记录.短信消息)(二) 前言:上一篇博客介绍的是获取联系人的实现,本篇博客将介绍通话记录的实现. 同

Android通讯录管理三之短息获取和发送短息

前两篇博客并分别讲了获取联系人和通话记录的知识,这篇主要介绍短信获取知识,短信在通讯管理中应该说是一个难点,因为短信涉及到短息会话和短信详情两个部分,并且短信的数据量比较大,可以采用AsyncQueryHandler框架来查询,同时采用CursorAdapter来绑定数据 其中短信中可以来获取联系人的头像和姓名.这个在代码工具类中有实现,如果联系人存在,则显示姓名,否则显示号码,如果联系人头像存在则显示头像,否则显示默认头像,如图片所示.这两部分功能在联系人和通话记录中均可以实现,有兴趣的童鞋可

Android通讯录管理二之通话记录获取

上一篇博客讲的是获取联系人信息,这篇是获取通话记录 同样你可以在这里下载http://download.csdn.net/detail/waniu123/8554533 package cn.zxw.contact.domain; /** * 通话记录 * @author zhan * */ public class CallLogInfo { public String number; public long date; public int type; public CallLogInfo(

Android通讯录数据库介绍与基本操作(增删改查)

Android通讯录数据库介绍与基本操作(增删改查) 2014年2月21日 Android通讯录管理总结 这几天导师安排我一个任务就是研究一下Android通讯录获取联系人.通话记录.短信的方法,还有看看不同Android版本之间的异同是否能做到兼容之类的事情.Android通讯录这一块,我个人感觉是挺乱的,网上一堆关于查询本地数据库获取联系人的方法,但似乎都没有仔细说明数据有哪些重要的表,它们之间有什么联系.下面是本人查询资料总结的一下知识点,方便童鞋们以后用到. http://xys2891

无废话Android之内容观察者ContentObserver、获取和保存系统的联系人信息、网络图片查看器、网络html查看器、使用异步框架Android-Async-Http(4)

1.内容观察者ContentObserver 如果ContentProvider的访问者需要知道ContentProvider中的数据发生了变化,可以在ContentProvider 发生数据变化时调用getContentResolver().notifyChange(uri, null)来通知注册在此URI上的访问者,例子如下: private static final Uri URI = Uri.parse("content://person.db"); public class

Android通讯录模糊查询搜索(号码,姓名,首字母简拼,全拼),批量选取联系人

Android通讯录模糊查询搜索(号码,姓名,首字母简拼,全拼),批量选取联系人 公司最近的项目中遇到一个需求需要读取通讯录联系人,并需要支持对联系人的模糊查询及批量选取,网上找了好几个例子,模糊查询这块处理的都有点小瑕疵,最终自己在各位网友的辛勤贡献基础之上进行了优化,最终做出了联系人模糊查询. 支持以下功能: 1.按 号码 , 姓名 , 首字母简拼 , 全拼 模糊查询 2.支持[A-Z]快速导航 3.支持联系人按首字母分类 4.支持联系人批量选取. 具体github地址:  https://

[Android Memory] Android内存管理、监测剖析

转载自:http://blog.csdn.net/anlegor/article/details/23398785 Android内存管理机制: Android内存管理主要有:LowMemory Killer机制,Ashmem,PMEM/ION及Native内存和Dalvik内存管理管理和JVM垃圾回收机制. LowMemory Killer机制: 源码位置drivers/staging/Android/lowmemorykiller.c Android是一个多任务系统,也就是说可以同时运行多个

(转)Android进程管理详解

Android的原理-不需要太多的剩余内存 不用在意剩余内存的大小.其实很多人都是把使用其他系统的习惯带过来来了.安卓Android大多应用没有退出的设计其实是有道理的,这和系统对进程的调度机制有关系.如果你知道java,就能更清楚这机制了.其实和java的垃圾回收机制类似,系统有一个规则来回收内存.进行内存调度有个阀值,只有低于这个值系统才会按一个列表来关闭用户不需要的东西.当然这个值默认设置得很小,所以你会看到内存老在很少的数值徘徊.但事实上他并不影响速度.相反加快了下次启动应用的速度.这本

[Android 性能优化系列]内存之基础篇--Android如何管理内存

大家如果喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 原文地址:http://developer.android.com/training/articles/memory.html 在接下来的一段时间里,我会每天翻译一部分关于性能提升的Android官方文档给大家 下面是本次的正文: ################ 随机访问存储器(Ram) 不管在哪种软件