文档章节

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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

java工程师用spring boot和web3j构建以太坊区块链应用

区块链最近IT世界的流行语之一。这项有关数字加密货币的技术,并与比特币一起构成了这个热门的流行趋势。它是去中心化的,不可变的分块数据结构,这是可以安全连接和使用的密码算法。在这种结...

笔阁
8分钟前
1
0
聊聊sentinel的SentinelWebAutoConfiguration

序 本文主要研究一下sentinel的SentinelWebAutoConfiguration SentinelWebAutoConfiguration spring-cloud-alibaba-sentinel-autoconfigure-0.2.0.BUILD-SNAPSHOT-sources.jar!/org/springf......

go4it
10分钟前
0
0
java ArrayList 根据对象内的属性排序

//根据修改时间排序Comparator com = new Comparator<ReleaseInfo>() {public int compare(ReleaseInfo reInfo1, ReleaseInfo reInfo2) { //return reInfo2.getModifyTime().c......

成长中的小白
10分钟前
0
0
PowerDesigner p f m

(非原创) P:PirmaryKey 主键 F:ForeignKey 外键 M:Mandatory 强制要求(不能为空) 主键: 主键是数据表的唯一索引,比如学生表里有学号和姓名,姓名可能有重名的,但学号确是唯一的,你要从...

森火
11分钟前
0
0
Nexus Repository Manager 搭建私有docker仓库

Nexus Repository Manager 搭建私有docker仓库 2018年05月08日 14:44:23 阅读数:115 1.下载nexus3的镜像: docker pull sonatype/nexus3 2.使用镜像启动一个容器: docker run -d --name n...

linjin200
12分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部