文档章节

ContentResolver获取手机联系人

Leozhu
 Leozhu
发布于 2015/02/26 14:59
字数 707
阅读 45
收藏 0

android系统的联系人是通过ContentProvider来提供的,想要获取联系人可使用ContentResolver。不啰嗦上代码

public class MainActivity extends Activity {
//用来展示联系人
ListView listview = null;
//展示联系人的适配器
MylistAdapter myadapter = null;

//存放联系人名称的listview
ArrayList<String> nameList = new ArrayList<String>();
//存放联系人号码的listview	
ArrayList<String> numberList = new ArrayList<String>();
//存放联系人头像的列表	
ArrayList<Bitmap> headList = new ArrayList<Bitmap>();

/** 获取库Phon表字段 **/
private static final String[] PHONES_PROJECTION = new String[] {
		Phone.DISPLAY_NAME, Phone.NUMBER, Photo.PHOTO_ID, Phone.CONTACT_ID };

/** 联系人显示名称 **/
private static final int PHONES_DISPLAY_NAME_INDEX = 0;

/** 电话号码 **/
private static final int PHONES_NUMBER_INDEX = 1;

/** 头像ID **/
private static final int PHONES_PHOTO_ID_INDEX = 2;

/** 联系人的ID **/
private static final int PHONES_CONTACT_ID_INDEX = 3;

/** 联系人名称 **/
private ArrayList<String> mContactsName = new ArrayList<String>();

/** 联系人号码 **/
private ArrayList<String> mContactsNumber = new ArrayList<String>();

/** 联系人头像 **/
private ArrayList<Bitmap> mContactsPhonto = new ArrayList<Bitmap>();

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

	getNumber();

	MylistAdapter adapter = new MylistAdapter();

	View view = null;
	view = view.inflate(MainActivity.this, R.layout.contactcount, null);
	TextView textCount = (TextView) view.findViewById(R.id.count);
	textCount.setText(nameList.size() + "位联系人");
	//listview底部添加底部标题
            listview.addFooterView(view);

	listview.setAdapter(adapter);

}

//获取联系人方法
public void getNumber() {

//获取ContentResolver实例
	ContentResolver resolver = MainActivity.this.getContentResolver();

//使用ContentResolver通过uri和获取字段
	Cursor phoneCursor = resolver.query(Phone.CONTENT_URI,
			PHONES_PROJECTION, null, null, null);

	if (phoneCursor != null) {
		while (phoneCursor.moveToNext()) {

//获取联系人号码 String phoneNumber = phoneCursor.getString(PHONES_NUMBER_INDEX); //获取联系人姓名 String contactName = phoneCursor .getString(PHONES_DISPLAY_NAME_INDEX); //获取联系人ID Long contactId = phoneCursor.getLong(PHONES_CONTACT_ID_INDEX); //获取联系人头像ID Long photoId = phoneCursor.getLong(PHONES_PHOTO_ID_INDEX);

			// 得到联系人头像Bitamp
			Bitmap contactPhoto = null;

			// photoid 大于0 表示联系人有头像 如果没有给此人设置头像则给他一个默认的
			if (photoId > 0) {
				Uri uri = ContentUris.withAppendedId(
						ContactsContract.Contacts.CONTENT_URI, contactId);
				InputStream input = ContactsContract.Contacts
						.openContactPhotoInputStream(resolver, uri);
				contactPhoto = BitmapFactory.decodeStream(input);
			} else {
				contactPhoto = BitmapFactory.decodeResource(getResources(),
						R.drawable.head);
			}

			nameList.add(contactName);
			numberList.add(phoneNumber);
			headList.add(contactPhoto);

		}
	}
}
}


class MylistAdapter extends BaseAdapter {
	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return nameList.size();
	}

	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {

		convertView = convertView.inflate(MainActivity.this,
				R.layout.contactitem, null);

		ImageView head = (ImageView) convertView.findViewById(R.id.head);
		TextView name = (TextView) convertView.findViewById(R.id.name);
		TextView num = (TextView) convertView.findViewById(R.id.num);

		head.setImageBitmap(headList.get(position));
		name.setText(nameList.get(position));
		num.setText(numberList.get(position));

		return convertView;
	}
}

布局见下方,至于图片随便弄个放在drawable文件中,manifest文件注意添加读取联系人权限

主界面布局 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" >

<ListView
    android:id="@+id/listview"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
</ListView>

</RelativeLayout>

列表条目布局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent">

<ImageView
    android:id="@+id/head"
    android:layout_alignParentLeft="true"
    android:layout_marginLeft="10dp"
    android:layout_width="20dp"
    android:layout_height="20dp" />

<TextView
    android:id="@+id/name"
    android:layout_centerHorizontal="true"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

<TextView
    android:id="@+id/num"
    android:layout_alignParentRight="true"
    android:layout_marginRight="10dp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

</RelativeLayout>

列表底部布局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" >

<TextView android:id="@+id/count"
    android:layout_centerInParent="true"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

</RelativeLayout>

© 著作权归作者所有

共有 人打赏支持
Leozhu
粉丝 0
博文 4
码字总数 791
作品 0
海淀
获取通讯录所有联系人的注意事项

上周写代码出现了一个bug,获取通讯录联系人的时候,总是不能够获取到只有名字,没有手机号的联系人。头疼了很久,记录一下。 我们都知道想要获取通讯录的所有联系人,肯定是要从手机的本地数...

小鹿啊小鹿
2017/03/20
0
0
关于Android中Contact API的讲解

今日学习任务:实现读取手机中所有联系人的主要信息(名称和联系电话),并以ListView显示 涉及的主要内容:1) Contact API的结构和使用方法 2) ContentProvider组件作用,URI概念及使用方法...

大爱rails
2013/07/04
0
0
说说 Android 的内容提供器(ContentResolver )

如果一个 APP 使用内容提供器对其数据提供了对外访问的接口,那么任何其他的 APP 都可以访问这部分的数据啦,像 Android 中的电话簿、短信等程序都提供了类似的访问接口。 1 ContentResolve...

deniro
05/05
0
0
Android四大组件之ContentProvide(内容提供者)

访问私有数据库 创建一个项目,在项目中利用SQLiteOpenHelper创建一个名称为account的数据库,并在数据库中创建一张名为info的表。 在MainActivity中需要调用以下代码才能创建数据库: 运行程...

早早的太阳
2016/09/25
6
0
基础总结篇之六:ContentProvider之读写联系人

今天我们来讲解一下如何利用ContentProvider机制读写联系人信息。 在Android中,ContentProvider是一种数据包装器,适合在不同进程间实现信息的共享。例如,在Android中SQLite数据库是一个典...

andy521zhu
2015/04/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

WinDbg

参考来自:http://www.cnit.net.cn/?id=225 SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols ctrl + d to open dump_file Microsoft (R) Windows Debugger Version 6.12.0002.633......

xueyuse0012
今天
2
0
OSChina 周五乱弹 —— 想不想把92年的萝莉退货

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @罗马的王:分享松澤由美的单曲《地球ぎ》 很久没看圣斗士星矢了 《地球ぎ》- 松澤由美 手机党少年们想听歌,请使劲儿戳(这里) @开源中国首...

小小编辑
今天
14
1
springBoot条件配置

本篇介绍下,如何通过springboot的条件配置,控制Bean的创建 介绍下开发环境 JDK版本1.8 springboot版本是1.5.2 开发工具为 intellij idea(2018.2) 开发环境为 15款MacBook Pro 前言 很多时候,...

贺小五
今天
1
0
javascript source map 的使用

之前发现VS.NET会为压缩的js文添加一个与文件名同名的.map文件,一直没有搞懂他是用来做什么的,直接删除掉运行时浏览器又会报错,后来google了一直才真正搞懂了这个小小的map文件背后的巨大...

粒子数反转
昨天
1
0
谈谈如何学Linux和它在如今社会的影响

昨天,还在农耕脑力社会,今天已经人工智能技术、大数据、信息技术的科技社会了,高速开展并迅速浸透到当今科技社会的各个方面,Linux日益成为人们信息时代的到来,更加考验我们对信息的处理程...

linux-tao
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部