以编程方式关闭 Android 手机

Posted

技术标签:

【中文标题】以编程方式关闭 Android 手机【英文标题】:Programmatically switching off Android phone 【发布时间】:2011-04-14 07:36:15 【问题描述】:

我们可以通过编程方式关闭 android 手机吗?

我正在使用以下 sn-p 但它对我不起作用。

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

lock.disableKeyguard(); // to disable

lock.reenableKeygaurd();// to enable

我也使用了权限。

【问题讨论】:

检查我的答案:***.com/questions/2927083/… 有根手机是可能的。 【参考方案1】:

作为CommonsWare already said,这在普通 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"


[另一方面:我在某处读到这些命令不适用于 Stock HTC ROM,但我自己还没有确认]

【讨论】:

我的手机已经root,我在 /system/app/ 推送应用。但它不适合我。 4.0有什么特别的吗??? 是否出现 SU 对话框?您使用的是哪款手机、android 和 rom? 在我的情况下,这段代码在单独的线程中执行时运行良好(否则 su 对话框已启动但不可见)。谢谢! 这两种情况都适用于我... SHUTDOWN:: reboot -p .... REBOOT: reboot ... 感谢您的帮助:) @Sheharyar:通常当我们以正常方式关闭时,我们会看到一个显示“正在关闭...”的对话框,但是当执行上述 sn-p 时,选项卡会非常突然关闭。是这样吗应该在关机前正常工作/执行(不显示任何对话框)?【参考方案2】:

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

【讨论】:

您知道提供该功能的固件吗?你能推荐一些吗?谢谢。 其实可以的。只需设置一些发送频繁未决意图的东西(例如,1Hz 的 GPS 或类似的东西),然后从不实际接收它们。在某些情况下,这会在一分钟内导致虚假重启。 (虽然不是真正的推荐方式......)【参考方案3】:

您可以使用 PowerManager 使其重新启动(这并不能保证它会重新启动 - 操作系统可能会取消它):

http://developer.android.com/reference/android/os/PowerManager.html#reboot(java.lang.String)

需要REBOOT权限:

http://developer.android.com/reference/android/Manifest.permission.html#REBOOT

您能否在尝试启用/禁用键盘保护时检查您的 logcat,并发布其中的内容?

【讨论】:

您无法从普通的 SDK 应用程序重新启动。只有使用系统固件签名密钥签名的应用程序才能执行此操作。 啊,好吧,很公平 - 好吧,无论如何我都会把它留下,这样他就可以阅读有关 PowerManager 的信息...【参考方案4】:

一个更好的解决方案是运行:

su -c am start -a android.intent.action.ACTION_REQUEST_SHUTDOWN

您可以为此使用Process

【讨论】:

很好的解决方案,除了 su 后面的命令应该用引号引起来。【参考方案5】:

如果你有 sigOrSystem 权限 android.permission.SHUTDOWN 你可以像这样提出受保护的 ACTION_REQUEST_SHUTDOWN Intent:

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 之前,此权限仅用于签名。

【讨论】:

这在我的情况下不起作用,应用程序崩溃,找不到处理 Intent 的活动【参考方案6】:

实际上,根据我的经验,上述回答并不完全准确。我正在尝试使屏幕变暗的方法,发现如下:

Window w = getWindow();
WindowManager.LayoutParams lp = w.getAttributes();
lp.screenBrightness =.005f;
w.setAttributes (lp);

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

我怀疑这是某个地方的错误,但我没有足够的硬件来测试其他 Android 型号上的代码。因此,我无法真正告诉您手机上会发生什么。我可以告诉你,我的代码关闭了我的手机,甚至完全未签名。

【讨论】:

这只会完全关闭我使用过的手机的屏幕。一定是你的标签上的一个奇怪的错误 这实际上是我当时正在寻找的效果——哦,好吧。我们已经为我们的系统更换了手机,并确定这不是我们想要的功能,但这是一件非常有趣的事情。

以上是关于以编程方式关闭 Android 手机的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式避免android手机中的深度睡眠模式?

如何以编程方式在 Android 中禁用 GSM 连接

Android:Android手机上的ssh客户端[关闭]

以编程方式获取 Android 手机型号,如何在 android 中以编程方式获取设备名称和型号?

如何在 Android 中以编程方式启用禁用 GPS? [复制]

如何以编程方式在android中关闭GPS? [复制]