1、简单的获取联系人的电话号码或电子邮件地址或邮政地址
static final int REQUEST_SELECT_CONTACT = 1;
public void selectContact() {
//action为Intent.ACTION_PICK
Intent intent = new Intent(Intent.ACTION_PICK);
//从有电话号码的联系人中选取
intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
//从有电子邮件地址的联系人中选取
// intent.setType(ContactsContract.CommonDataKinds.Email.CONTENT_TYPE);
//从有邮政地址的联系人中选取。
// intent.setType(ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_TYPE);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(intent, REQUEST_SELECT_CONTACT);
}
}
解析结果:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_SELECT_CONTACT&& resultCode == RESULT_OK) {
// 目标联系人的Uri
Uri contactUri = data.getData();
String[] projection = new String[]{CommonDataKinds.Phone.NUMBER};
Cursor cursor = getContentResolver().query(contactUri, projection,
null, null, null);
//
if (cursor != null && cursor.moveToFirst()) {
int numberIndex = cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER);
//电话号码
String number = cursor.getString(numberIndex);
}
}
}
2、获取联系人头像Uri、名称等信息
打开手机联系人界面
static final int REQUEST_SELECT_CONTACT = 1;
public void selectContact() {
Intent intent = new Intent(Intent.ACTION_PICK);
//type为ContactsContract.Contacts.CONTENT_TYPE
intent.setType(ContactsContract.Contacts.CONTENT_TYPE);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(intent, REQUEST_SELECT_CONTACT);
}
}
根据目标联系人的Uri获取该联系人的ContactsContract.Data.LOOKUP_KEY用于查询所需数据,这里借助系统的LoaderManager进行查询,以下为完整查询代码:
public class SecondActivity extends Activity implements LoaderManager
.LoaderCallbacks<Cursor> {
private static final String TAG = SecondActivity.class.getSimpleName();
//定义查询的字段值,这里主要看联系人名称DISPLAY_NAME和头像资源的Uri--PHOTO_URI,当然,你也可以只列出你想要的字段,不必列出DATA1-DATA15
private static final String[] PROJECTION =
new String[]{
ContactsContract.Data._ID,
ContactsContract.Data.MIMETYPE,
ContactsContract.Data.DISPLAY_NAME,
ContactsContract.Data.PHOTO_URI,
ContactsContract.Data.DATA1,
ContactsContract.Data.DATA2,
ContactsContract.Data.DATA3,
ContactsContract.Data.DATA4,
ContactsContract.Data.DATA5,
ContactsContract.Data.DATA6,
ContactsContract.Data.DATA7,
ContactsContract.Data.DATA8,
ContactsContract.Data.DATA9,
ContactsContract.Data.DATA10,
ContactsContract.Data.DATA11,
ContactsContract.Data.DATA12,
ContactsContract.Data.DATA13,
ContactsContract.Data.DATA14,
ContactsContract.Data.DATA15
};
// 查询语句,这里根据联系人表中的LOOKUP_KEY来查询
private static final String SELECTION = ContactsContract.Data.LOOKUP_KEY + " = ?";
private String[] mSelectionArgs = {""};
//查询的目标联系人的LOOKUP_KEY
private String mLookupKey;
//排序条件
private static final String SORT_ORDER = ContactsContract.Data.MIMETYPE;
// 此次查询操作的标识id,如果只有一个查询,没其他查询操作可以不用
static final int DETAILS_QUERY_ID = 0;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
mLookupKey = getIntent().getStringExtra(ContactsContract.Contacts.LOOKUP_KEY);
// 初始化系统的LoaderManager
getLoaderManager().initLoader(DETAILS_QUERY_ID, null, this);
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
switch (id) {
case DETAILS_QUERY_ID:
mSelectionArgs[0] = mLookupKey;
// 开始查询
CursorLoader mLoader =
new CursorLoader(
SecondActivity.this,
ContactsContract.Data.CONTENT_URI,
PROJECTION,
SELECTION,
mSelectionArgs,
SORT_ORDER
);
return mLoader;
default:
return null;
}
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
switch (loader.getId()) {
case DETAILS_QUERY_ID:
cursor.moveToFirst();
int nameColumnIndex = cursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME);
String name = cursor.getString(nameColumnIndex);
Log.d(TAG, "联系人名称" + "======" + name);
int photoColumnIndex = cursor.getColumnIndex(ContactsContract.Data.PHOTO_URI);
String photoUri = cursor.getString(photoColumnIndex);
Log.d(TAG, "联系人头像Uri" + "======" + photoUri);
break;
}
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
switch (loader.getId()) {
case DETAILS_QUERY_ID:
/*
* 当前的loader被销毁时会回调这个方法,需要在这里释放掉对当前cursor的引用
*
*/
break;
}
}
}
3、获取所有联系人信息
public static List<ContactInfo> readContactInfo(Context context) {
Uri contactUri = Uri.parse("content://com.android.contacts/raw_contacts");
Uri datatUri = Uri.parse("content://com.android.contacts/data");
ContentResolver resolver = context.getContentResolver();
Cursor cursor = resolver.query(contactUri, new String[]{"contact_id"}, null, null, null);
List<ContactInfo> list = new ArrayList<ContactInfo>();
while(cursor.moveToNext()){
String id = cursor.getString(0);
System.out.println("id : " + id );
// 要准备 一个ContactInfo类的实例, 去封装 数据了
ContactInfo info = new ContactInfo();
Cursor dataCursor = resolver.query(datatUri, new String[]{"data1","mimetype"}, "raw_contact_id=?", new String[]{id}, null);
while(dataCursor.moveToNext()){
String data = dataCursor.getString(0);
String type = dataCursor.getString(1);
if("vnd.android.cursor.item/email_v2".equals(type)){
info.setEmail(data);
}else if("vnd.android.cursor.item/im".equals(type)){
info.setIm(data);
}else if("vnd.android.cursor.item/name".equals(type)){
info.setName(data);
}else if("vnd.android.cursor.item/phone_v2".equals(type)){
info.setPhone(data);
}else if("vnd.android.cursor.item/photo".equals(type)){
info.setPhoto(data);
}
}
dataCursor.close();
//将联系人 添加到 list 中去
list.add(info);
System.out.println("========");
}
cursor.close();
return list;
}
public class ContactInfo {
private String name; //
private String phone; //
private String email; //
private String photo; //
private String status;
private String im; // 即时通讯号
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhoto() {
return photo;
}
public void setPhoto(String photo) {
this.photo = photo;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getIm() {
return im;
}
public void setIm(String im) {
this.im = im;
}
@Override
public String toString() {
return "ContactInfo [name=" + name + ", phone=" + phone + ", email="
+ email + ", im=" + im + "]"+",photo="+photo;
}
}