☰分类导航

软件工程/安全与权限管理
课程进度 65% · 第8/11章第8/11章 · 标签 1/6
— 1 —

运行时权限

权限、Keystore与加密代码需真实Android环境和安全设计。原AES-GCM示例的参数类型已纠正;硬件保护取决于设备与密钥属性,不能一概宣称所有密钥均在TEE。权限与存储API还受系统和targetSdk影响。

Android 6.0(API 23)引入了运行时权限机制。敏感权限需要在运行时向用户申请,用户可随时在设置中撤销。

权限申请应由用户正在进行的功能触发,而非一打开应用就请求全部敏感能力。拒绝和撤销都是正常状态,需要保留输入并提供可用替代路径。权限通过只说明系统允许尝试访问,仍要处理硬件、文件或服务不可用的失败。


```java
// AndroidManifest.xml 声明权限
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

// 运行时权限申请
if (ContextCompat.checkSelfPermission(this,
        Manifest.permission.CAMERA)
        != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this,
        new String[]{Manifest.permission.CAMERA}, REQUEST_CODE);
} else {
    openCamera();
}

// 处理权限结果
@Override
public void onRequestPermissionsResult(int requestCode,
        String[] permissions, int[] grantResults) {
    if (requestCode == REQUEST_CODE
            && grantResults.length > 0
            && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        openCamera();
    }
}
```
java
1
// AndroidManifest.xml 声明权限
2
<uses-permission android:name="android.permission.CAMERA" />
3
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
4
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
5
 
6
// 运行时权限申请
7
if (ContextCompat.checkSelfPermission(this,
8
Manifest.permission.CAMERA)
9
!= PackageManager.PERMISSION_GRANTED) {
10
ActivityCompat.requestPermissions(this,
11
new String[]{Manifest.permission.CAMERA}, REQUEST_CODE);
12
} else {
13
openCamera();
14
}
15
 
16
// 处理权限结果
17
@Override
18
public void onRequestPermissionsResult(int requestCode,
19
String[] permissions, int[] grantResults) {
20
if (requestCode == REQUEST_CODE
21
&& grantResults.length > 0
22
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
23
openCamera();
24
}
25
}
— 2 —

权限分类

  • 正常权限 —— 安装时自动授予,如 INTERNET、ACCESS_NETWORK_STATE
  • 危险权限 —— 需运行时申请,如相机、位置、麦克风、存储
  • 特殊权限 —— SYSTEM_ALERT_WINDOW、WRITE_SETTINGS,需特殊处理
◆

权限最佳实践

  • 在使用功能时才申请权限,不要安装后立即申请
  • 提供解释说明为什么要该权限(Android 官方推荐)
  • 处理用户拒绝"不再询问"的情况,引导用户到设置页面
  • 使用 shouldShowRequestPermissionRationale() 判断是否需解释

!用户拒绝权限后应用仍需正常工作,必须有降级方案