跳到主要内容
SUN / 笔记
← 全部文章

权限机制

权限机制概述

Android 使用权限机制来保护用户隐私和设备安全。每个应用运行时都是被隔离的,无法直接访问系统资源或其他应用的数据,除非获得明确授权。权限机制是 Android 的一种“沙箱”设计体现。


权限的分类

  1. 普通权限(Normal Permissions)
    • 涉及用户隐私较少,系统会在安装时自动授予。
    • 例如:访问网络、设置壁纸、蓝牙等。
    • 不需要在运行时再次申请。
  2. 危险权限(Dangerous Permissions)
    • 涉及用户敏感信息或操作,如读取联系人、定位、拨打电话等。
    • 需要在 AndroidManifest.xml 中声明,并且在运行时向用户请求授权(Android 6.0+)。
  3. 特殊权限(Special Permissions)
    • 系统级权限,必须通过特定设置界面授权,不能通过普通 API 请求。
    • 如:SYSTEM_ALERT_WINDOW(悬浮窗权限)、WRITE_SETTINGS(修改系统设置)、PACKAGE_USAGE_STATS(获取应用使用情况)。
  4. 签名权限(Signature Permissions)
    • 仅授予具有相同签名证书的应用,通常用于系统或厂商级别的功能。

权限声明

所有权限都必须先在 AndroidManifest.xml 中声明,例如:

下面是一些常用的权限

xml
    <uses-permission android:name="android.permission.INTERNET" /> <!-- 添加网络权限 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 添加网络状态权限 -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 添加Wi-Fi状态权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 添加写入外部存储权限 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- 添加读取外部存储权限 -->
    <uses-permission android:name="android.permission.CAMERA" /> <!-- 添加相机权限 -->
    <uses-permission android:name="android.permission.RECORD_AUDIO" /> <!-- 添加录音权限 -->
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <!-- 添加修改音频设置权限 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 添加读取电话状态权限 -->
    <uses-permission android:name="android.permission.CALL_PHONE" /> <!-- 添加拨打电话权限 -->
    <uses-permission android:name="android.permission.SEND_SMS" /> <!-- 添加发送短信权限 -->
    <uses-permission android:name="android.permission.READ_SMS" /> <!-- 添加读取短信权限 -->

运行时权限请求(适用于 Android 6.0 及以上)

  1. 检查权限是否已被授予
kotlin
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
    != PackageManager.PERMISSION_GRANTED) {
    // 未授予,需申请
}
  1. 请求权限
kotlin
ActivityCompat.requestPermissions(
    this,
    arrayOf(Manifest.permission.CAMERA),
    CAMERA_REQUEST_CODE
)
  1. 处理用户响应结果
kotlin
override fun onRequestPermissionsResult(
    requestCode: Int, permissions: Array<String>, grantResults: IntArray
) {
    if (requestCode == CAMERA_REQUEST_CODE) {
        if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // 权限被授予
        } else {
            // 权限被拒绝
        }
    }
}

权限组(Permission Groups)

Android 将危险权限划分为权限组。只要用户授权一个组中的权限,其他权限会自动授权。例如:

  • android.permission.READ_CONTACTS
  • android.permission.WRITE_CONTACTS

都属于 "android.permission-group.CONTACTS",授权其中一个后再请求另一个不再提示。


常用权限清单(危险权限)

权限组 具体权限示例 描述
联系人 READ_CONTACTS, WRITE_CONTACTS 读取和修改联系人
电话 CALL_PHONE, READ_PHONE_STATE, ADD_VOICEMAIL 拨号、读取设备信息
位置 ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION 精确/粗略定位
存储 READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE 访问外部存储
短信 SEND_SMS, READ_SMS, RECEIVE_SMS 发送、读取和接收短信
相机 CAMERA 拍照或摄像
麦克风 RECORD_AUDIO 音频录制
传感器 BODY_SENSORS 健康传感器

特殊权限示例及申请方式

  1. 悬浮窗权限(如微信聊天头)
xml
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

申请方式:

kotlin
if (!Settings.canDrawOverlays(this)) {
    val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
        Uri.parse("package:$packageName"))
    startActivity(intent)
}
  1. 修改系统设置
xml
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
if (!Settings.System.canWrite(this)) {
    val intent = Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS,
        Uri.parse("package:$packageName"))
    startActivity(intent)
}

权限拒绝与适配建议

  • 如果用户永久拒绝了权限(勾选“不再询问”),再申请权限将不弹框,应引导用户到设置页手动开启。
  • 动态权限申请建议封装成工具类或用第三方库如 EasyPermissions、PermissionX。

Android 权限机制是保障系统安全和用户隐私的基础。开发时要遵循“最小权限原则”:只申请真正需要的权限,并清晰地向用户解释用途。通过 Manifest 声明 + 运行时申请 + 用户响应处理三步,实现对权限的完整控制。

相关文章

AndroidStudio使用教程(第六弹) →AndroidRuntime_ART与Dalvik →1.系统架构 →