java.lang.SecurityException: Permission Denial: opening provider
这个异常通常发生在Android开发中,当应用程序尝试访问一个需要特定权限的ContentProvider时,如果没有获得相应的权限,就会抛出这个异常。
READ_CONTACTS
, WRITE_EXTERNAL_STORAGE
等。出现Permission Denial
异常的原因通常是:
AndroidManifest.xml
文件中声明所需的权限。AndroidManifest.xml
中声明权限<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
在尝试访问ContentProvider之前,需要检查并请求权限。
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, REQUEST_CODE);
} else {
// 已经拥有权限,可以进行操作
}
处理权限请求的结果:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CODE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 权限被授予,可以进行操作
} else {
// 权限被拒绝,提示用户
}
}
}
假设我们要访问联系人信息:
// 检查权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
// 请求权限
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, REQUEST_CODE_READ_CONTACTS);
} else {
// 权限已授予,读取联系人
readContacts();
}
private void readContacts() {
Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
if (cursor != null) {
while (cursor.moveToNext()) {
// 处理联系人信息
}
cursor.close();
}
}
通过上述步骤,可以有效解决java.lang.SecurityException: Permission Denial: opening provider
异常,确保应用在访问ContentProvider时有正确的权限。
领取专属 10元无门槛券
手把手带您无忧上云