如何通过java api实现重启设备?

执行Runtime.getRuntime().exec(“su -c reboot”);后设备没有重启,想问下有没有其他方法可以做到重启设备?

@gaohongjun JAVA我不是很熟悉,你这个命令,实际上就是替换执行了su -c reboot 这个命令是吧?

对,是的。我在adb shell里面su,然后执行reboot是可以重启设备的,不知道为什么在java层行不通。
或者有其他可以重启设备的方案吗?@Frank

@gaohongjun adb shell里面是有超级权限的,你在应用层这样子操作不一定可以. @Terry 我们安卓的同时也许能帮你

JAVA控制重启有两种方法,一种是用run命令,一种是发广播的方式

  • 方法一 (不会有重启的对话框弹出,该方法在我的应用里面验证是可以的,但是我的应用有系统签名)
try {
            Process proc = Runtime.getRuntime().exec(new String[]{"reboot"});
            proc.waitFor();
      } catch (Exception e) {
            e.printStackTrace();
     }
  • 方法二 (会有重启的对话框弹出,不过会自动重启,不用手动确认)
 try {      
          Intent intent1 = new Intent(Intent.ACTION_REBOOT);
          intent1.putExtra("nowait", 1);
          intent1.putExtra("interval", 1);
          intent1.putExtra("window", 0);
          context.sendBroadcast(intent1);
   } catch (Exception e){
          e.printStackTrace();
  }

2 Likes

1、第一种方法试过了,估计是系统签名的问题,我的应用没有足够的权限所以方法无效;
2、第二种方法用的时候会抛异常:java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.REBOOT,在AndroidManifest.xml里面添加android.permission.REBOOT则提示Permission is only granted to system app.

如果采用第二种发广播的形式的话,你要在你的应用的AndroidManifest.xml文件里面增加

android:sharedUserId="android.uid.system"
android:sharedUserId="android.uid.system"

加这个后apk在安装时会提示install failed shared userid incompatible,估计还是绕不开签名问题。

我手上有一个老化重启的应用,采用广播形式的,不管是amlgoic平台还是rockchip平台都是可以用的,应该不存在签名的问题,下午我再确认一下回复你

好的,但愿是我的用法有问题,非常期待你的回复,谢谢。@Terry

方法一是OK的,方法二需要签名,你用方法一验证一下,不要加su -c

1 Like

Ok,我下午的时候验证一下方法一, 谢谢。

@Terry 验证了一下,方法一不加su -c时可以重启设备,多谢你的支持。