如何以编程方式重新启动手机?

时间:2017-01-04 06:18:34

标签: android

我正在创建app(仅适用于Android 6),我必须使用按钮点击提供重启功能。 我使用以下代码:

PowerManager pm =(PowerManager) getSystemService(Context.POWER_SERVICE);   
pm.reboot(null);

并添加了权限:

uses-permission android:name="android.permission.REBOOT",    
uses-permission android:name="android.permission.DEVICE_POWER" ,    
uses-permission android:name="android.permission.MODIFY_PHONE_STATE"

但是收到以下错误:

  

java.lang.SecurityException:既不是用户10298也不是当前进程   有android.permission.REBOOT。

5 个答案:

答案 0 :(得分:2)

请尝试

try {
Runtime.getRuntime().exec("su");
  Runtime.getRuntime().exec("reboot");
} catch (IOException e) {
}  

OR

Runtime.getRuntime().exec(new String[]{"/system/bin/su","-c","reboot now"});

如果不起作用:Runtime.getRuntime().exec(new String[]{"su","-c","reboot now"});而不是

UPDATE1

您可以使用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

必须能够重启设备。不适用于第三方应用程序。常量值:" android.permission.REBOOT"

  

您无法从普通的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 :(得分:1)

如果您运行Android M(API 23),则必须为重新启动设置运行时权限。

如果设备运行的是Android 6.0或更高版本,并且您的应用的目标SDK为23或更高:应用必须列出清单中的权限,并且必须在应用运行时请求其所需的每个危险权限。用户可以授予或拒绝每个权限,即使用户拒绝权限请求,应用也可以继续以有限的功能运行。

Requesting Permissions at Run Time

答案 2 :(得分:0)

根据@MaňishYadav的回答,由于安全原因,您的应用应该是设备所有者重新启动。

您无法从普通的SDK应用程序重新启动。只有使用系统固件签名密钥签名的应用程序才能执行此操作 复制了这个答案,

Programmatically switching off Android phone

您需要使用系统密钥对您的应用进行签名。有关详细信息,请参阅此帖子;

How to compile Android Application with system permissions

如果您是设备的root用户,则可以按照此方法成为设备所有者。

首先,创建一个文件device_owner.xml,其中包含以下内容:

<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<device-owner package="your.owner.app.package.id" name="Your app name" />

现在执行以下步骤

  • adb push device_owner.xml / sdcard /

  • adb shell

  • cp /sdcard/device_owner.xml / data / system /

  • cd / data / system /

  • chown system:system device_owner.xml

  • 重新启动

  

注意:在重新启动设备之前,请确保已安装了您尝试设备所有者的应用程序。如果你不这样做,你将获得无限时间的启动动画。

For more info

答案 3 :(得分:0)

`Process proc = null;
    try {
        proc = Runtime.getRuntime().exec(new String[] { "su", "-c", "reboot" });
        try {
            proc.waitFor();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }`

答案 4 :(得分:-2)

这是我的答案和可能对您有帮助的代码:

if (ContextCompat.checkSelfPermission(this, Manifest.permission.REBOOT)
                != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.REBOOT}, 1);
            if(ContextCompat.checkSelfPermission(this, Manifest.permission.REBOOT)
                    != PackageManager.PERMISSION_GRANTED) {
                PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
                pm.reboot(null);
            }
        } else {
            PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
            pm.reboot(null);
        }