如何在不使用READ_CONTACTS权限的情况下查找联系人的地址?

时间:2014-10-08 11:34:32

标签: android permission-denied contactscontract

我需要从联系人列表中获取某些联系人的地址。我使用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权限。 任何想法都将不胜感激。

由于

1 个答案:

答案 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) {
    }