联系人提供了自己ContentProvider,因此可以使用ContentResolver来访问它的数据。
举例来说:
.............
//创建一个隐式Intent
final Intent pickIntent = new Intent(Intent.ACTION_PICK,
ContactsContract.Contacts.CONTENT_URI);
mSuspectButton = (Button)v.findViewById(R.id.crime_suspect);
mSuspectButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//启动联系人,并要求返回结果
startActivityForResult(pickIntent, REQUEST_CONTACT);
}
});
..............
处理返回结果的代码如下:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
...........
} else if (requestCode == REQUEST_CONTACT && data != null) {
//返回结果中包含了,选择的数据对应的地址
//根据这个地址,就可以访问联系人中uri对应的ContentProvider的数据
Uri contactUri = data.getData();
//指定需要访问的内容
String[] queryFields = new String[] {
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts._ID
};
//得到对应的Cursor
Cursor c = getActivity().getContentResolver()
.query(contactUri, queryFields, null, null, null);
if (c == null) {
return;
}
try {
if (c.getCount() == 0) {
return;
}
c.moveToFirst();
String suspect = c.getString(0);
mCrime.setSuspect(suspect);
mSuspectButton.setText(suspect);
mSuspectContactId = c.getString(1);
mDialButton.setEnabled(true);
} finally {
c.close();
}
}
................
}
联系人应用返回结果Intent时,会添加Intent.FLAG_GRANT_READ_URI_PERMISSION标志。
该标志赋予当前应用访问contactUri对应的联系人数据的权限。