<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255);"></span>
<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255);"></span>
有两种做法:效果图如下:
(1)
(2)

首先加入权限:
<!-- 读取联系人权限 -->
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<!-- 拨打电话权限 -->
<uses-permission android:name="android.permission.CALL_PHONE"/>
第一种
(1.1)布局文件
<?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="wrap_content"
android:padding="20dp">
<ImageView
android:id="@+id/image"
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@drawable/ic_launcher"/>
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/image"
android:layout_alignParentRight="true"
android:layout_marginLeft="10dp"
android:singleLine="true"
android:text="hello"
android:ellipsize="marquee"
android:textSize="20dp" />
<TextView
android:id="@+id/moble"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/image"
android:layout_below="@+id/name"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_marginLeft="10dp"
android:singleLine="true"
android:ellipsize="marquee"
android:text="hello"
android:textSize="15dp" />
</RelativeLayout>
(1.2)Activity.java
package com.zhnag.adresslist;
import java.io.InputStream;
import java.util.ArrayList;
import android.app.ListActivity;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
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.provider.ContactsContract.CommonDataKinds.Photo;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
public class PhoneAdressActivity extends ListActivity {
Context mContext = null;
/** 获取库Phone表字段 **/
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 = 0;
/** 电话号码 **/
private static final int PHONES_NUMBER = 1;
/** 头像ID **/
private static final int PHONES_PHOTO_ID = 2;
/** 联系人的ID **/
private static final int PHONES_CONTACT_ID = 3;
/** 联系人名称 **/
private ArrayList<String> mContactsName = new ArrayList<String>();
/** 联系人头像 **/
private ArrayList<String> mContactsNumber = new ArrayList<String>();
/** 联系人头像 **/
private ArrayList<Bitmap> mContactsImg = new ArrayList<Bitmap>();
ListView mListView = null;
private MyListAdapter mAdapter;
private RelativeLayout rely;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = this;
mListView = this.getListView();
/** 得到手机通讯录联系人信息 **/
getPhoneContacts();
mAdapter = new MyListAdapter(this);
setListAdapter(mAdapter);
mListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view,
int position, long id) {
// 调用系统方法拨打电话
Intent dialIntent = new Intent(Intent.ACTION_CALL, Uri
.parse("tel:" + mContactsNumber.get(position)));
startActivity(dialIntent);
}
});
}
// 获取手机联系人
private void getPhoneContacts() {
// rely=(RelativeLayout) findViewById(R.id.relationId);
ContentResolver resolver = mContext.getContentResolver();
// 获取手机联系人
Cursor phoneCursor = resolver.query(Phone.CONTENT_URI,
PHONES_PROJECTION, null, null, null);
// 不为空
if (phoneCursor != null) {
while (phoneCursor.moveToNext()) {
// 得到手机号码
String phoneNumber = phoneCursor.getString(PHONES_NUMBER);
// 当手机号码为空的或者为空字段 跳过当前循环
if (TextUtils.isEmpty(phoneNumber))
continue;
// 得到联系人名称
String contactName = phoneCursor.getString(PHONES_DISPLAY_NAME);
// 得到联系人ID
Long contactid = phoneCursor.getLong(PHONES_CONTACT_ID);
// 得到联系人头像ID
Long imgid = phoneCursor.getLong(PHONES_PHOTO_ID);
// 得到联系人头像Bitamp
Bitmap bitmap = null;
// photoid 大于0 表示联系人有头像 如果没有给此人设置头像则给他一个默认的
if (imgid > 0) {
Uri uri = ContentUris.withAppendedId(
ContactsContract.Contacts.CONTENT_URI, contactid);
InputStream input = ContactsContract.Contacts
.openContactPhotoInputStream(resolver, uri);
bitmap = BitmapFactory.decodeStream(input);
} else {
// 设置默认
bitmap = BitmapFactory.decodeResource(getResources(),
R.drawable.ic_launcher);
}
mContactsName.add(contactName);
Log.i("info", "contactName---" + contactName);
// Log.i("info","mContactsName111"+mContactsName);
mContactsNumber.add(phoneNumber);
mContactsImg.add(bitmap);
}
phoneCursor.close();
}
}
/** 得到手机SIM卡联系人人信息 **/
private void getSIMContacts() {
ContentResolver resolver = mContext.getContentResolver();
// 获取Sims卡联系人
Uri uri = Uri.parse("content://icc/adn");
Cursor phoneCursor = resolver.query(uri, PHONES_PROJECTION, null, null,
null);
if (phoneCursor != null) {
while (phoneCursor.moveToNext()) {
// 得到手机号码
String phoneNumber = phoneCursor.getString(PHONES_NUMBER);
// 当手机号码为空的或者为空字段 跳过当前循环
if (TextUtils.isEmpty(phoneNumber))
continue;
// 得到联系人名称
String contactName = phoneCursor.getString(PHONES_DISPLAY_NAME);
// Sim卡中没有联系人头像
mContactsName.add(contactName);
mContactsNumber.add(phoneNumber);
}
phoneCursor.close();
}
}
// 添加适配器
class MyListAdapter extends BaseAdapter {
public MyListAdapter(Context context) {
mContext = context;
}
public int getCount() {
// 设置绘制数量
return mContactsName.size();
}
@Override
public boolean areAllItemsEnabled() {
return false;
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ImageView iamge = null;
TextView name = null;
TextView moble = null;
if (convertView == null || position < mContactsNumber.size()) {
convertView = LayoutInflater.from(mContext).inflate(
R.layout.lianxiren, null);
iamge = (ImageView) convertView.findViewById(R.id.image);
name = (TextView) convertView.findViewById(R.id.name);
moble = (TextView) convertView.findViewById(R.id.moble);
}
// 绘制联系人名称
if (mContactsName.get(position) != null) {
name.setText(mContactsName.get(position));
}
Log.i("info",
position + "mContactsName------"
+ mContactsName.get(position));
// 绘制联系人号码
moble.setText(mContactsNumber.get(position));
// Log.i("info","mContactsNumber------"+mContactsNumber.get(position));
// 绘制联系人头像
iamge.setImageBitmap(mContactsImg.get(position));
return convertView;
}
}
}
第二种
(2.1)布局文件
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" >
<Button
android:id="@+id/btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_margin="20dp"
android:text="获取手机联系人" />
<ListView
android:id="@+id/listview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/btn"/>
</RelativeLayout>
list.xml
<?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="wrap_content"
android:padding="10dp"
>
<ImageView
android:id="@+id/image"
android:layout_width="50dp"
android:layout_height="50dp"
/>
<TextView
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/image"
android:layout_alignParentRight="true"
android:singleLine="true"
android:layout_marginLeft="20dp"
android:text="hello"
android:textSize="20dp" />
<TextView
android:id="@+id/moble"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/image"
android:layout_below="@+id/name"
android:layout_alignParentRight="true"
android:layout_marginLeft="20dp"
android:text="hello"
android:textSize="15dp" />
</RelativeLayout>
(2.2)实体类ContactVo.java
package com.zhang.cantacts;
import android.graphics.Bitmap;
public class ContactVo {
private long id;
private String name;
private String moble;
private Bitmap img;
public ContactVo() {
super();
}
public ContactVo(long id, String name, String moble, Bitmap img) {
super();
this.id = id;
this.name = name;
this.moble = moble;
this.img = img;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMoble() {
return moble;
}
public void setMoble(String moble) {
this.moble = moble;
}
public Bitmap getImg() {
return img;
}
public void setImg(Bitmap img) {
this.img = img;
}
@Override
public String toString() {
return "ContactVo [id=" + id + ", name=" + name + ", moble=" + moble
+ ", img=" + img + "]";
}
}
(2.3)MyAdapter.java
package com.zhang.cantacts;
import java.io.InputStream;
import java.util.List;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.provider.ContactsContract;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class MyAdapter extends BaseAdapter {
private Context mContext;
private List<ContactVo> mData;
public MyAdapter(Context mContext, List<ContactVo> mData) {
super();
this.mContext = mContext;
this.mData = mData;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return mData.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return mData.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return mData.get(position).getId();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder mHolder = null;
if (convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(
R.layout.contart, null);
mHolder = new ViewHolder();
mHolder.name = (TextView) convertView.findViewById(R.id.name);
mHolder.moble = (TextView) convertView.findViewById(R.id.moble);
mHolder.imgV = (ImageView) convertView.findViewById(R.id.image);
convertView.setTag(mHolder);
} else {
mHolder = (ViewHolder) convertView.getTag();
mHolder.imgV.setImageResource(R.drawable.ic_launcher);
}
ContactVo cv = mData.get(position);
mHolder.name.setText(cv.getName());
// Log.i("info", "22222222" + cv.getName());
mHolder.moble.setText(cv.getMoble());
mHolder.imgV.setImageBitmap(cv.getImg());
return convertView;
}
class ViewHolder {
TextView name, moble;
ImageView imgV;
}
}
(2.4)MainActivity.java
package com.zhang.cantacts;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.Photo;
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.text.TextUtils;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ListView;
public class MainActivity extends Activity {
/** 获取库Phone表字段 **/
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 = 0;
/** 电话号码 **/
private static final int PHONES_NUMBER = 1;
/** 头像ID **/
private static final int PHONES_PHOTO_ID = 2;
/** 联系人的ID **/
private static final int PHONES_CONTACT_ID = 3;
private MyAdapter mAdapter;
private ListView listview;
private Button btn;
private List<ContactVo>lists=new ArrayList<ContactVo>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listview=(ListView) findViewById(R.id.listview);
btn=(Button) findViewById(R.id.btn);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
getPhoneContacts();
}
});
}
private void getPhoneContacts() {
// rely=(RelativeLayout) findViewById(R.id.relationId);
ContentResolver resolver = getContentResolver();
List<ContactVo>list=new ArrayList<ContactVo>();
// 获取手机联系人
Cursor phoneCursor = resolver.query(Phone.CONTENT_URI,
PHONES_PROJECTION, null, null, null);
// 不为空
if (phoneCursor != null) {
while (phoneCursor.moveToNext()) {
ContactVo cv=new ContactVo();
// 得到手机号码
String phoneNumber = phoneCursor.getString(PHONES_NUMBER);
// 当手机号码为空的或者为空字段 跳过当前循环
if (TextUtils.isEmpty(phoneNumber))
continue;
// 得到联系人名称
String contactName = phoneCursor.getString(PHONES_DISPLAY_NAME);
// 得到联系人ID
Long contactid = phoneCursor.getLong(PHONES_CONTACT_ID);
// 得到联系人头像ID
Long imgid = phoneCursor.getLong(PHONES_PHOTO_ID);
// 得到联系人头像Bitamp
Bitmap contactPhoto = null;
// photoid 大于0 表示联系人有头像 如果没有给此人设置头像则给他一个默认的
if (imgid > 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);
}
cv.setName(contactName);
//Log.i("info", "1111111"+contactName);
cv.setMoble(phoneNumber);
cv.setImg(contactPhoto);
//Log.i("info", "img----"+contactPhoto);
list.add(cv);
}
phoneCursor.close();
lists.clear();
lists.addAll(list);
// Log.i("info", "lists----"+lists);
}
mAdapter=new MyAdapter(this, lists);
listview.setAdapter(mAdapter);
}
}
参考:http://blog.youkuaiyun.com/snwrking/article/details/7601794
源码下载:http://download.youkuaiyun.com/detail/zhang106209/9532858
如果有问题,回复我。