我需要从联系人列表中获取某个联系人的地址。我使用ACTION_PICK意图来做到这一点:
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType(ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_TYPE);
startActivityForResult(intent, ActivitiesRequestCodes.REQUEST_CODE_PICK_CONTACT);
当在onActivityResult
中收到结果时,我解析结果以获得联系人的地址:
Cursor cursor = getContentResolver().query(contactDataUri, null,null, null, null);
StringBuilder address = new StringBuilder();
if (cursor != null && cursor.moveToFirst()) {
// read street
int streetIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET);
String street = cursor.getString(streetIndex);
// read city etc .....
}
此代码是基于以下内容编写的:传递到onActivityResult()回调的结果Intent包含指向所选联系人数据的内容:URI。即使您的应用程序不包含read_CONTACTS权限,响应也会授予您的应用读取该联系人数据的临时权限(http://developer.android.com/guide/components/intents-common.html#Contacts)
三星设备上的一切都很完美,但令人惊讶!在Htc设备上,解析代码崩溃,出现安全异常:
由以下原因引起:java.lang.SecurityException:拒绝权限:正在读取com.android.providers.contacs.HtcContactsProvider2-uricontent://com.android.contacts/data/1478从pid=11661,uid=10197需要android.permission.READ_CONCATS或grantUriPermission()
下一步该怎么办?我不能使用READ_CONTACTS权限。任何想法都将不胜感激。
感谢
从联系人选择器中,您将在不添加权限的情况下获得联系人详细信息,请尝试此代码
Cursor cursor = null;
try {
// getData() method will have the Content Uri of the selected contact
Uri uri = data.getData();
//Query the content uri
String[] projection = new String[]{ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME};
cursor = context.getContentResolver().query(uri, projection, null, null, null);
cursor.moveToFirst();
} catch (Exception e) {
}