【发布时间】:2016-06-05 00:05:47
【问题描述】:
我想检查新的权限模型是如何工作的,所以在应用程序的设置中我禁用了Contacts。然后我去应用程序并尝试阅读Contacts 并且......它有点工作:
try {
Uri result = data.getData();
int contentIdx;
cursor = getContentResolver().query(result, null, null, null, null);
contentIdx = cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER);
if(cursor.moveToFirst()) {
content = cursor.getInt(contentIdx);
}
if(content > 0) {
contentIdx = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
if(cursor.moveToFirst()) {
name = cursor.getString(contentIdx);
}
contentIdx = cursor.getColumnIndex(BaseColumns._ID);
if(cursor.moveToFirst()) {
content = cursor.getLong(contentIdx);
}
cursor = managedQuery(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, new String[] { Phone.NUMBER }, Data.CONTACT_ID + "=?", new String[] { String.valueOf(content) }, null);
if(cursor.moveToFirst()) {
number = cursor.getString(cursor.getColumnIndex(Phone.NUMBER));
}
}
} catch (Exception e) {
//SecurityException
}
- 我可以读取联系人姓名
- 当我尝试读取联系人号码时,
SecurityException被抛出
java.lang.SecurityException: Permission Denial: 从 pid=20123 读取 com.android.providers.contacts.HtcContactsProvider2 uri content://com.android.contacts/data/phones,uid=10593 需要 android.permission.READ_CONTACTS , 或 grantUriPermission()
为什么会这样?
【问题讨论】:
-
请注意,您没有使用谷歌的 ContactsContract,如您所见,我们看到您正在访问 com.android.providers.contacts.HtcContractsProvider,可能 HTC 存在验证权限问题。我的建议是检查 AOSP 设备,看看是否同样如此。如果它不是真的,那么这意味着它是 HTC 内部的权限泄漏问题。如果它们相同,则听起来像是 AOSP 问题。
-
它也在 Nexus 上重现。
标签: android android-6.0-marshmallow android-permissions android-contacts