我需要从联系人列表中获取某些联系人的地址。我使用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:Permission Denial:从pid = 11661,uid = 10197读取com.android.providers.contacts.HtcContactsProvider2 uri content://com.android.contacts/data/1478需要android.permission.READ_CONTACTS或grantUriPermission()
下一步该怎么做?我不能使用READ_CONTACTS权限。 任何想法都将不胜感激。
由于
答案 0 :(得分:0)
从联系人选择器,您将获得联系方式,而无需添加权限,请尝试使用此代码
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) {
}