以编程方式关闭Android手机

37

我们能否通过编程方式关闭Android手机?

我正在使用以下代码片段,但它对我没有起作用。

KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Activity.KEYGUARD_SERVICE); 
KeyguardLock lock = keyguardManager.newKeyguardLock(KEYGUARD_SERVICE); 

lock.disableKeyguard(); // to disable

lock.reenableKeygaurd();// to enable

我也使用了权限。


1
可以在已经root的手机上实现。 - Rob
6个回答

38

正如CommonsWare已经说明的那样,这在普通SDK应用程序中是不可能的。您需要使用System Firmware Key对您的应用进行签名。但如果您拥有Root权限,则可以实现。如果您具有SU访问权限,请尝试使用以下代码:

关机:

try {
    Process proc = Runtime.getRuntime()
                    .exec(new String[]{ "su", "-c", "reboot -p" });
    proc.waitFor();
} catch (Exception ex) {
    ex.printStackTrace();
}

重新启动:

使用"reboot"代替"reboot -p" 即可,代码保持不变。


[另外一点:我在某处读到这些命令不适用于原装HTC ROM,但我自己还没有确认过]


1
在我的情况下,当代码在单独的线程中执行时,它可以很好地工作(否则su对话框会启动但不可见)。谢谢! - ruX
1
这个对我两种情况都有效...SHUTDOWN:: reboot -p....REBOOT: reboot...感谢帮助 :) - Noman
是的,这是因为它没有正确地结束所有正在运行的应用程序。但是,如果您想要相同的效果,请尝试在AsyncTask中包装它,并在doInBackground中使用ProgressBar和几秒钟的睡眠。 - Sheharyar
它正在使用“su”命令工作。是否可能不使用“su”命令? - Sathish
@Sathish 不行。你没有root权限,不能关机。 - Sheharyar
显示剩余3条评论

23

您无法从普通的SDK应用程序中执行此操作。只有使用系统固件签名密钥签名的应用程序才能执行此操作。


1
你知道有哪些固件可以提供这种功能吗?你能推荐一些吗?谢谢。 - Budda
2
实际上你是可以的。只需设置一个发送频繁挂起意图的东西(例如,GPS在1Hz或类似的频率),然后从未实际接收它们。在某些情况下,这将导致不到一分钟的虚假重启。(虽然这并不是推荐的方法...) - Michael

16

17
普通的SDK应用程序无法进行重启操作,只有使用系统固件签名密钥签署的应用程序才能执行这个操作。 - CommonsWare
1
好的,没问题 - 那我还是把这个留下来,这样他就可以了解一下PowerManager... - xil3

9
一个更好的解决方案是运行:
su -c am start -a android.intent.action.ACTION_REQUEST_SHUTDOWN
您可以使用 Process 来实现。

很好的解决方案,除了su后面的命令应该加引号。 - Jesko Hüttenhain

6

如果您拥有sigOrSystem权限android.permission.SHUTDOWN,您可以像这样发出受保护的ACTION_REQUEST_SHUTDOWN意图:

Intent intent = new Intent("android.intent.action.ACTION_REQUEST_SHUTDOWN");
intent.putExtra("android.intent.extra.KEY_CONFIRM", false);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

请注意,在Android 4.0之前,此权限仅为签名权限。


这在我的情况下不起作用,应用程序崩溃并显示“找不到处理意图的活动”。 - Abdul Waheed

1
实际上,根据我的经验,以上的回答并不完全准确。我正在尝试调暗屏幕的方法,并发现以下内容有效:
Window w = getWindow();
WindowManager.LayoutParams lp = w.getAttributes();
lp.screenBrightness =.005f;
w.setAttributes (lp);

如果我使用屏幕亮度值为0而不是0.005,实际上会关闭我的三星Galaxy Tab。

我怀疑这是某个bug,但我没有足够的硬件来测试其他Android型号上的代码。因此,我无法告诉您在您的手机上会发生什么。我可以告诉您,即使完全未签名,我的代码也会关闭我的手机。


我使用过的手机上,这只是完全关闭屏幕。你的Tab上一定有一个奇怪的错误。 - stealthcopter
这实际上是我当时寻找的效果 - 哦好吧。我们已经为我们的系统更换了电话,并确定那不是我们想要的功能,但发现它是一件非常有趣的事情。 - Rich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接