权限机制概述
Android 使用权限机制来保护用户隐私和设备安全。每个应用运行时都是被隔离的,无法直接访问系统资源或其他应用的数据,除非获得明确授权。权限机制是 Android 的一种“沙箱”设计体现。
权限的分类
- 普通权限(Normal Permissions)
- 涉及用户隐私较少,系统会在安装时自动授予。
- 例如:访问网络、设置壁纸、蓝牙等。
- 不需要在运行时再次申请。
- 危险权限(Dangerous Permissions)
- 涉及用户敏感信息或操作,如读取联系人、定位、拨打电话等。
- 需要在
AndroidManifest.xml中声明,并且在运行时向用户请求授权(Android 6.0+)。
- 特殊权限(Special Permissions)
- 系统级权限,必须通过特定设置界面授权,不能通过普通 API 请求。
- 如:
SYSTEM_ALERT_WINDOW(悬浮窗权限)、WRITE_SETTINGS(修改系统设置)、PACKAGE_USAGE_STATS(获取应用使用情况)。
- 签名权限(Signature Permissions)
- 仅授予具有相同签名证书的应用,通常用于系统或厂商级别的功能。
权限声明
所有权限都必须先在 AndroidManifest.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 及以上)
- 检查权限是否已被授予
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
// 未授予,需申请
}
- 请求权限
ActivityCompat.requestPermissions(
this,
arrayOf(Manifest.permission.CAMERA),
CAMERA_REQUEST_CODE
)
- 处理用户响应结果
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_CONTACTSandroid.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 |
健康传感器 |
特殊权限示例及申请方式
- 悬浮窗权限(如微信聊天头)
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
申请方式:
if (!Settings.canDrawOverlays(this)) {
val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:$packageName"))
startActivity(intent)
}
- 修改系统设置
<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 声明 + 运行时申请 + 用户响应处理三步,实现对权限的完整控制。