App Ops 四种权限状态分别代表什么
四种状态速查表
| 状态 | 底层 mode | 应用看到什么 | 典型场景 |
|---|---|---|---|
| 允许 | allow | 正常获取真实数据 | 确实需要该权限的应用 |
| 拒绝 | force-stop | 收到明确错误 | 不再让应用拥有这个能力 |
| 忽略 | ignore | 应用以为权限在,但拿到空数据 | 专治不给权限就不运行 |
| 仅在使用期间允许 | foreground | 前台时正常,后台被限制 | 不让应用在后台偷偷用权限 |

详细解读
允许(Allow)
应用可以正常获取权限对应的真实数据。这相当于 App Ops 不干预这个权限,让系统默认行为生效。
使用场景:你信任这个应用,或者它确实需要这个权限才能正常工作。例如地图应用需要位置权限才能导航。
忽略(Ignore)
App Ops 的杀手锏功能。底层把 appops 设为 ignore,系统在应用尝试获取数据时返回空白(空列表、空字符串、空对象等),但不会报错。应用认为权限是"允许"状态,但拿到的数据是假的。
使用场景:不想给应用数据但又不想它因为权限被拒而退出。最典型的就是那些"不给定位就不让用"的流氓应用——设为忽略后它能照常运行,只是拿不到你的位置。
拒绝(Force Stop)
在系统层面明确拒绝权限请求。应用在检查权限时收到明确的"拒绝"返回值。绝大多数应用检测到拒绝后会停止运行或反复弹窗。
使用场景:你完全不想让应用拥有这个能力。例如永远不允许某应用使用相机。但要注意拒绝可能导致应用无法运行,这时候应该改用"忽略"。
仅在使用期间允许(Foreground)
Android 10 引入的模式。应用在前台运行时可以正常获取数据,但切到后台后系统会强制终止该权限相关的行为。底层把 appops 设为 foreground。
使用场景:允许应用在你主动使用它的时候用权限,但不允许它在后台偷偷用。适合相机、麦克风、位置等敏感权限——应用在你眼前的时候没问题,切出去就不让它用了。
每种状态的技术边界
- 允许:相当于系统默认行为,App Ops 不做干预
- 忽略 vs 拒绝:忽略让应用"以为权限在但拿不到数据",拒绝让应用"知道权限不在"。应用都有手段检测两者的区别,但绝大多数不会检测 ignore 状态
- 仅在使用期间允许:依赖 Android 10+ 的 foreground appops mode,老系统不支持
- 拒绝(Force Stop):可能会连带触发系统级的应用停止(取决于系统版本和具体 appop),慎用
推荐的默认策略
对于每个应用的每个权限,一个务实的默认策略是:
- 确实需要才能正常运行 → 允许
- 不想给但不给也不退出 → 忽略
- 不想给且即使退出也无所谓 → 拒绝
- 想让它能用但不能后台偷用 → 仅在使用期间允许