android 读取手机通讯录并显示listview

脉脉中注册时有一个,我已开启权限:

这个原理:

1、如果通讯录为空,脉脉就不让你往下进行,

2、如果没有开启权限,脉脉就不让你往下进行,

3、如果开启权限且通讯录为空,脉脉就不让你往下进行,

4、如果开启权限且通讯录不为空,脉脉才能让你往下进行。

读取通讯录权限

<!-- 读取联系人权限 -->
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <!-- 拨打电话权限 -->
    <uses-permission android:name="android.permission.CALL_PHONE" />

关键代码

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

	private static final String[] PHONES_PROJECTION = new String[] {
			Phone.DISPLAY_NAME, Phone.NUMBER, Phone.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 void getPhoneContacts() {
		ContentResolver resolver = getContentResolver();
		try {
			// 获取手机联系人
			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);
					// 当手机号码为空的或者为空字段 跳过当前循环
					if (TextUtils.isEmpty(phoneNumber))
						continue;

					// 得到联系人名称
					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.ic_launcher);
					}
					ContactEntity mContact = new ContactEntity(contactName,
							phoneNumber, contactPhoto);
					mContacts.add(mContact);
				}
				phoneCursor.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

ContactEntity实体类代码:

package com.yqy.yqy_testtxl;

import android.graphics.Bitmap;
/**
 * 联系人信息
 * @author YQY
 *
 */
public class ContactEntity {
	/** 联系人名称 **/
	private String name;
	/** 联系人号码 **/
	private String number;
	/** 联系人头像 **/
	private Bitmap photo;

	@Override
	public String toString() {
		return "ContactEntity [name=" + name + ", number=" + number
				+ ", photo=" + photo + "]";
	}

	public ContactEntity(String name, String number, Bitmap photo) {
		super();
		this.name = name;
		this.number = number;
		this.photo = photo;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getNumber() {
		return number;
	}

	public void setNumber(String number) {
		this.number = number;
	}

	public Bitmap getPhoto() {
		return photo;
	}

	public void setPhoto(Bitmap photo) {
		this.photo = photo;
	}

}

显示到listview:

private void initList() {
		ListView lv = (ListView) findViewById(R.id.listView1);
		lv.setAdapter(new MyAdapter());
	}

	class MyAdapter extends BaseAdapter {

		@Override
		public int getCount() {
			if (mContacts != null && mContacts.size() > 0) {
				return mContacts.size();
			} else {
				return 0;
			}
		}

		@Override
		public Object getItem(int position) {
			if (mContacts != null && mContacts.size() > 0) {
				return mContacts.get(position);
			} else {
				return null;
			}
		}

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

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			ViewHolder holder = null;
			if (convertView == null) {
				holder = new ViewHolder();
				convertView = LayoutInflater.from(MainActivity.this).inflate(
						R.layout.item_contact, null);
				holder.name = (TextView) convertView.findViewById(R.id.tv_name);
				holder.number = (TextView) convertView
						.findViewById(R.id.tv_number);
				holder.photo = (ImageView) convertView
						.findViewById(R.id.iv_photo);
				convertView.setTag(holder);
			}else{
				holder = (ViewHolder) convertView.getTag();
			}
			ContactEntity contact = mContacts.get(position);
			holder.name.setText(contact.getName()+"");
			holder.number.setText(contact.getNumber()+"");
			holder.photo.setImageBitmap(contact.getPhoto());
			return convertView;
		}

		class ViewHolder {
			TextView name;
			TextView number;
			ImageView photo;
		}

	}

MainActivity全部代码:

package com.yqy.yqy_testtxl;

import java.io.InputStream;
import java.util.ArrayList;

import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		getPhoneContacts();
		Log.e("YQY", mContacts.size() + "-------------mContacts---------");

		initList();
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

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

	private static final String[] PHONES_PROJECTION = new String[] {
			Phone.DISPLAY_NAME, Phone.NUMBER, Phone.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 void getPhoneContacts() {
		ContentResolver resolver = getContentResolver();
		try {
			// 获取手机联系人
			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);
					// 当手机号码为空的或者为空字段 跳过当前循环
					if (TextUtils.isEmpty(phoneNumber))
						continue;

					// 得到联系人名称
					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.ic_launcher);
					}
					ContactEntity mContact = new ContactEntity(contactName,
							phoneNumber, contactPhoto);
					mContacts.add(mContact);
				}
				phoneCursor.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private void initList() {
		ListView lv = (ListView) findViewById(R.id.listView1);
		lv.setAdapter(new MyAdapter());
	}

	class MyAdapter extends BaseAdapter {

		@Override
		public int getCount() {
			if (mContacts != null && mContacts.size() > 0) {
				return mContacts.size();
			} else {
				return 0;
			}
		}

		@Override
		public Object getItem(int position) {
			if (mContacts != null && mContacts.size() > 0) {
				return mContacts.get(position);
			} else {
				return null;
			}
		}

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

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			ViewHolder holder = null;
			if (convertView == null) {
				holder = new ViewHolder();
				convertView = LayoutInflater.from(MainActivity.this).inflate(
						R.layout.item_contact, null);
				holder.name = (TextView) convertView.findViewById(R.id.tv_name);
				holder.number = (TextView) convertView
						.findViewById(R.id.tv_number);
				holder.photo = (ImageView) convertView
						.findViewById(R.id.iv_photo);
				convertView.setTag(holder);
			}else{
				holder = (ViewHolder) convertView.getTag();
			}
			ContactEntity contact = mContacts.get(position);
			holder.name.setText(contact.getName()+"");
			holder.number.setText(contact.getNumber()+"");
			holder.photo.setImageBitmap(contact.getPhoto());
			return convertView;
		}

		class ViewHolder {
			TextView name;
			TextView number;
			ImageView photo;
		}

	}

}

activity_main.xml:

<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"
    tools:context=".MainActivity" >

    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true" >
    </ListView>

</RelativeLayout>

运行截图就不上了。。。

复制去Google翻译翻译结果

时间: 2024-08-03 13:33:07

android 读取手机通讯录并显示listview的相关文章

狂刷Android范例之5:读取手机通讯录

狂刷Android范例之5:读取手机通讯录 说明 狂刷Android范例系列文章开张了.每篇学习一个Android范例,将一个范例单独生成一个可运行的app,并对重点源代码进行简要分析.然后提供打包好的源代码下载. 功能 提供完整代码,通过ContenResolver,读取手机通讯录的内容. 代码包在此,无需下载分: http://download.csdn.net/detail/logicteamleader/8806135 来源 例子来自于Android-20的com.example.and

Android 读取手机联系人、拨号、发送短信及长按菜单的操作

本示例实现了读取手机联系人,拨号.发送短信及长按出现菜单选项的操作↓ 1.Andrid项目结构图↓主要操作图中红色方框内的文件. 2.首先布局代码如下↓ a, main.xml 程序运行的主界面,主要用ListView列表控件展示手机联系人 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/a

Android 个人手机通讯录开发

一.Android 个人手机通讯录开发 数据存储:SQLite 数据库 开发工具:Android Studio 二.Phone Module 简介 1. 界面展示                2. 文件结构简单分析 三.个人手机通讯录代码实现 1. 清单文件 (AndroidManifest.xml) <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http

Android 简易手机通讯录(源码)

简易手机通讯录 一:功能模块 1.主界面,通过listview 展示所有联系人信息,并在没有联系人时给出友好提示 2.主界面.显示最近查看的某个联系人信息 3.主界面,可以长按某联系人项,弹出菜单,删除该联系人;删除联系人后,在手机通知栏弹出信息给用户提示 4.主界面选择分组,可以查看所有联系人,也可以只查看某一分组的联系人 5.点击主界面的某联系人,可以进入联系人详情界面,查看联系人各详细信息,并可修改联系人各信息: 联系人的性别和所在分组可通过下拉菜单选择:长按电话号码,可以进入拨打电话功能

android 获取通讯录并显示listview

网上找的demo 每一段都有详细注释 关键代码如下: 权限: <!-- 读取联系人权限 --> <uses-permission android:name="android.permission.READ_CONTACTS" /> <!-- 拨打电话权限 --> <uses-permission android:name="android.permission.CALL_PHONE" /> 代码: package co

android获取手机通讯录

在android中读取联系人信息的程序,包括读取联系人姓名.手机号码和邮箱 (转载自博客:http://www.cnblogs.com/error404/archive/2013/03/12/2956090.html) 1:androidmanifest.xml的内容 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android

Android 读取后台数据并显示。模拟小区车辆管理系统

帮别人做的演示系统,只具有基本的增删查改功能. 核心是android端和后台通过http传输数据 后台是asp.net,数据库是ms sql 2008 android端 private void getData() { RequestParams params = new RequestParams(); params.put("action", "getlista"); params.put("chepai", etSearch.getText

Android程序设计-简单手机通讯录

在微信中,手机QQ中你会发现软件读取手机通讯录这个功能,这个功能使得软件更好的与手机联系人绑定,从而达到分享,拨打电话,读取用户信息等操作.下面我们将通过一个demo实现这个功能 首先我们看一下效果图: -----------------------------------------------------------[正题部分]----------------------------------------------- [开发环境]Android Stdio 1.1.0 [分析] 软件中含

android获取手机录

在Android开发中,读取手机通讯录中的号码是一种基本操作,但是由于Android的版本众多,所以手机通讯录操作的代码比较纷杂,在本文中进行一下总结. Android1.5是现在的Android系统中最低的版本,首先来说一下适用于Android1.5及以上版本(含2.X,3.X)的代码实现: //获得所有的联系人 Cursor cur = context.getContentResolver().query( Contacts.People.CONTENT_URI, null, null, n