java.lang.SecurityException: Permission Denial
是 Android 系统中常见的安全异常,表示应用尝试执行某项操作但缺乏必要的权限。当尝试启动一个 Intent 但被系统拒绝时,就会出现这种错误。
这种错误通常由以下几种情况引起:
确保在 AndroidManifest.xml 中声明了所有必要的权限。例如:
<manifest ...>
<!-- 例如需要访问互联网 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 例如需要访问外部存储 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 其他必要权限 -->
...
</manifest>
对于 Android 6.0 (API 23) 及以上版本,危险权限需要在运行时请求:
// 检查权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
// 请求权限
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CAMERA},
REQUEST_CODE_CAMERA);
}
// 处理权限请求结果
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CODE_CAMERA) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 权限已授予
} else {
// 权限被拒绝
}
}
}
如果尝试启动其他应用的 Activity/Service/BroadcastReceiver:
android:exported="true"
)// 显式 Intent 示例
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.example.package", "com.example.package.TargetActivity"));
startActivity(intent);
确保隐式 Intent 有正确的 action、category 和 data:
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.example.com"));
// 检查是否有应用可以处理此 Intent
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
} else {
// 没有应用可以处理此 Intent
}
CAMERA
权限READ/WRITE_EXTERNAL_STORAGE
权限try {
startActivity(intent);
} catch (SecurityException e) {
e.printStackTrace();
// 处理权限被拒绝的情况
Toast.makeText(this, "无法执行此操作,请检查权限设置", Toast.LENGTH_SHORT).show();
}