Android 12+有系统权限应用如何编程实现设备关机?
新版本Android设备上实现系统应用低电量自动关机的可行方案
问题原因说明
android.intent.action.ACTION_SHUTDOWN是系统内部广播,仅用于通知应用系统即将关机,应用无法主动发送该广播触发关机,因此会抛出权限异常。reboot -p命令失效通常是因为不同厂商定制系统对Root命令的支持存在差异,或是su执行环境的路径、权限配置问题。
方案一:调整Root命令执行方式(最通用)
不同设备的关机命令可能存在差异,尝试以下几种有效命令,并确保正确执行Root命令:
- 可选命令:
su -c 'poweroff'su -c 'shutdown -h now'su -c '/system/bin/reboot -p'(指定完整路径避免环境变量问题)
执行命令的代码示例(需处理流避免进程阻塞):
public void shutdownWithRoot() { String[] commands = {"/system/bin/su", "-c", "poweroff"}; try { Process process = Runtime.getRuntime().exec(commands); // 必须读取并关闭输入流、错误流,否则进程可能阻塞无响应 process.getInputStream().close(); process.getErrorStream().close(); process.waitFor(); } catch (Exception e) { e.printStackTrace(); } }
提示:部分设备的su路径可能为
/su/bin/su,可先通过which su命令确认路径后替换。
方案二:利用系统应用权限调用PowerManager API
若你的应用是系统签名应用(已预装为系统应用且使用平台签名),可直接调用系统API触发关机:
- 在
AndroidManifest.xml中添加系统权限:
<uses-permission android:name="android.permission.SHUTDOWN" />
- 调用PowerManager的关机方法:
public void shutdownWithSystemApi(Context context) { PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE); if (powerManager != null) { // 参数说明:是否需要用户确认关机,是否等待所有后台进程结束 powerManager.shutdown(false, true); } }
此方法无需Root,但要求应用必须是系统签名应用,普通Root应用无法使用。
方案三:操作sysfs节点(需Root)
部分设备支持直接写入sysfs节点触发关机,执行命令:
su -c 'echo shutdown > /sys/power/state'
代码示例:
public void shutdownWithSysfs() { String[] commands = {"/system/bin/su", "-c", "echo shutdown > /sys/power/state"}; try { Process process = Runtime.getRuntime().exec(commands); process.getInputStream().close(); process.getErrorStream().close(); process.waitFor(); } catch (Exception e) { e.printStackTrace(); } }
提示:不同设备的sysfs路径可能不同,若
/sys/power/state无效,可尝试/sys/power/shutdown等替代路径。
内容的提问来源于stack exchange,提问作者Charles Semaan
相关产品推荐
相关产品推荐

