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;
}
}
}