Android如何通过编程方式调起系统Power Menu电源菜单
安卓调起系统电源关机/重启对话框实现方案
你在Play Store看到的这类工具没有用什么黑科技,核心就是通过安卓无障碍服务提供的全局动作API直接唤起系统原生电源菜单,不需要ROOT、不需要系统签名,只需要用户手动给应用开启无障碍权限即可,实现效果和长按实体电源键弹出的菜单完全一致,和你给出的演示效果匹配。

具体实现步骤
1. 配置无障碍服务权限
首先在项目res/xml目录下新建无障碍服务配置文件,比如命名为power_accessibility_config.xml,必须开启手势执行权限,配置如下:
<?xml version="1.0" encoding="utf-8"?> <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" android:accessibilityEventTypes="typeAllMask" android:accessibilityFeedbackType="feedbackGeneric" android:accessibilityFlags="flagDefault" android:canPerformGestures="true" android:description="@string/accessibility_tip" android:notificationTimeout="100" />
注意:
android:canPerformGestures="true"是必填项,没有这个配置无法执行全局操作。其中accessibility_tip是给用户看的权限说明,要明确写清楚开启权限是用来唤起电源菜单,不要隐瞒用途,否则上架应用市场会被拒。
2. 在清单文件注册无障碍服务
在AndroidManifest.xml中注册自定义的无障碍服务类,关联上面写好的配置文件:
<service android:name=".PowerAccessibilityService" android:exported="true" android:label="@string/app_name" android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"> <intent-filter> <action android:name="android.accessibilityservice.AccessibilityService" /> </intent-filter> <meta-data android:name="android.accessibilityservice" android:resource="@xml/power_accessibility_config" /> </service>
3. 编写服务逻辑触发电源菜单
新建类继承AccessibilityService,直接调用系统提供的全局动作API即可,不需要自己模拟按键、注入事件:
class PowerAccessibilityService : AccessibilityService() { companion object { // 服务运行状态标记,可根据自己的业务逻辑调整实现 var isRunning = false } override fun onServiceConnected() { super.onServiceConnected() isRunning = true } override fun onAccessibilityEvent(event: AccessibilityEvent?) { // 不需要处理具体事件,留空即可 } override fun onInterrupt() { isRunning = false } // 对外调用的方法,触发系统电源菜单 fun openSystemPowerMenu() { // 系统预置全局动作:唤起电源对话框 performGlobalAction(GLOBAL_ACTION_POWER_DIALOG) } }
用户开启无障碍服务后,只要调用openSystemPowerMenu()方法,就会直接弹出系统原生电源菜单,自带关机、重启、紧急呼叫等系统默认选项,和长按电源键的效果完全一致。
注意事项
- 该方案仅支持Android 5.0(API级别21)及以上系统,低版本安卓没有开放这个全局动作API,无法实现该效果。
- 无障碍权限属于特殊敏感权限,应用无法自动申请,必须先检测服务是否开启,未开启时跳转系统无障碍设置页面,引导用户手动开启。
- 不要尝试用模拟长按电源键的注入事件方案,不同厂商ROM对电源键的事件拦截逻辑差异很大,很容易出现适配问题。直接调用
GLOBAL_ACTION_POWER_DIALOG是官方标准API,所有通过CTS兼容性认证的设备都必须支持,适配成本最低。 - 上架应用市场时必须明确告知用户无障碍权限的用途,不得滥用无障碍权限采集用户数据,否则会被应用市场下架。
内容的提问来源于stack exchange,提问作者Orwa Ra
相关产品推荐
相关产品推荐

