有些手机需要权限READ_CONTACTS才能从联系人选择器中读取

时间:2014-06-02 14:41:55

标签: java android permissions

我有 HTC ONE M7 (GPE 4.2.2)和 HTC EVO 3D (4.0.3)HTC Sense 3.6

HTC ONE 不需要:

<uses-permission android:name="android.permission.READ_CONTACTS" /> 

on HTC EVO 3D 但是,以下代码会引发异常:

 public static String getPhoneNumberFromIntent(Context context, Intent data) throws SecurityException {
    String contactNumber = null;
    final Uri contactUri = data.getData();
    if (contactUri != null) {
        Cursor c = null;
        try {
            // Read contact number from contacts provider
            String[] projection = new String[] {ContactsContract.CommonDataKinds.Phone.NUMBER};
            c = context.getContentResolver().query(contactUri, projection, null, null, null);
            if (c != null && c.moveToFirst()) {
                int maxNumberLength = context.getResources().getInteger(R.integer.max_phone_number_cze);
                contactNumber = cutOnlyLastPhoneNumberDigits(c.getString(0), maxNumberLength);
            }
        } finally {
            if (c != null) {
                c.close();
            }
        }
    }
    return contactNumber;
}

-

java.lang.SecurityException: Permission Denial: reading com.android.providers.contacts.HtcContactsProvider2
uri content://com.android.contacts/data/2158 from pid=14938, uid=10125 requires android.permission.READ_CONTACTS

我已经读过,当用户手动选择联系人时,appliaction被授予了所需的权限。但是在某些手机上这不起作用(HTC EVO 3D)。

为什么会这样?有一种解决方法,比如能否在运行时请求此权限?

2 个答案:

答案 0 :(得分:4)

  

HTC ONE在HTC EVO 3D上不需要:<uses-permission android:name="android.permission.READ_CONTACTS" />但是,以下代码会抛出异常

如果您获得的Uri来自ACTION_PICKACTION_GET_CONTENT,则您是否拥有该联系人的临时阅读权限会因联系人选择应用而异。

  

我已经读过,当用户手动选择联系人时,appliaction被授予了所需的权限。但是在某些手机上这不起作用(HTC EVO 3D)。

并不要求所有联系人挑选应用程序都授予您对联系人的临时读取权限。事实上,我不清楚第三方联系人管理员是否有能力授予您对联系人的临时读取权限。

  

是否有解决方法可以在运行时请求此权限?

您无法在运行时更改候选权限组合。

您的选择是:

  1. 始终在清单中询问READ_CONTACTS。这可以确保您可以以请求其他权限的方式执行您想要的操作,这是潜在用户可能不喜欢的权限。

  2. 处理SecurityException,如果数据不是必需的话,只需要处理您尝试query()的数据。

  3. 使用READ_CONTACTS权限编写一个单独的应用,该应用可以作为您应用的“插件”,代表您的主应用安全地检索联系人数据。然后,您可以路由获得SecurityException的用户来安装您的联系人插件。在不引入安全漏洞的情况下写这个很棘手,所以我鼓励你使用其他任何一个选项。

答案 1 :(得分:0)

您无法在运行时获得许可。您只能为您的权限添加级别API,例如:

<uses-permission
     android:name="android.permission.WRITE_EXTERNAL_STORAGE"
     android:maxSdkVersion="18" />

这意味着如果api为19或更高,则不需要权限。