Runtime.exec():在Android重新启动?

我正在寻找一个解决scheme,可以用来重新启动一个有根的设备。 我知道重新启动设备对于用户来说是非常糟糕的devise, 正如这里所说的那样 ,而不是真正的应用程序。 主要目的是在testing期间重新启动手机(我工作在一个video聊天应用程序,有时我需要重新启动时,一切都南下)

我观察到,重新启动电话比使用ACTION_REBOOT重新启动时通常在terminal(例如, adb shell或ConnectBot)中重新启动要快得多 ,我无法继续使用。

目前,我能够获得超级用户权限

 Process root = Runtime.getRuntime().exec("su"); 

但我不能做实际的重新启动。 我尝试G1(HTC)和Galaxy S(三星),没有任何成功。 我在/system/bin/rebootfind了可执行文件

以下是我的一些尝试:

 Process reboot = Runtime.getRuntime().exec("/system/bin/reboot"); Process reboot = Runtime.getRuntime().exec("reboot"); Process reboot = Runtime.getRuntime().exec("su reboot"); 

我阅读这篇关于Runtime.exec()的缺陷的文章 ,但我想我不是这种情况。

由于使用ConnectBot使我可以做这样的行动,我敢肯定这是可能的。 请不要告诉我去看看ConnectBot代码 ,这是一个大而复杂的项目:)

你能帮我解决这个问题吗?

谢谢。

Solutions Collecting From Web of "Runtime.exec():在Android重新启动?"

重启在Android中正常工作。 你可能没有正确地执行runtime.exec()。 你需要处理

  public static void rebootSU() { Runtime runtime = Runtime.getRuntime(); Process proc = null; OutputStreamWriter osw = null; StringBuilder sbstdOut = new StringBuilder(); StringBuilder sbstdErr = new StringBuilder(); String command="/system/bin/reboot"; try { // Run Script proc = runtime.exec("su"); osw = new OutputStreamWriter(proc.getOutputStream()); osw.write(command); osw.flush(); osw.close(); } catch (IOException ex) { ex.printStackTrace(); } finally { if (osw != null) { try { osw.close(); } catch (IOException e) { e.printStackTrace(); } } } try { if (proc != null) proc.waitFor(); } catch (InterruptedException e) { e.printStackTrace(); } sbstdOut.append(ReadBufferedReader(new InputStreamReader(proc .getInputStream()))); sbstdErr.append(ReadBufferedReader(new InputStreamReader(proc .getErrorStream()))); if (proc.exitValue() != 0) { } } 

最后经过几周的search:

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

我发现我不能以编程方式重新启动。

另外,我可以使用terminal模拟器应用程序在我的android手机上打开一个terminal窗口,键入su获得root访问的#提示,然后键入“#reboot”,我得到“不允许!

有什么build议么?

好吧,我不明白,我知道了。 在HTC手机上,即使使用SU root访问权限,重新启动命令也不起作用。 需要调用BUSYBOX来执行重启命令。

此代码适用于三星Galaxy S2,S4,索尼Xperia S(LTi 26)

 public static void rebootDevice() { try { Process process = Runtime.getRuntime().exec("su"); DataOutputStream os = new DataOutputStream(process.getOutputStream()); os.writeBytes("reboot \n"); } catch (Throwable t) {t.printStackTrace;} } 

经过漫长的斗争,我find了工作的解

如果您的系统使用串口,​​那么执行下面的命令,

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

如果使用正常的端口然后在命令下面取消

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

区别只在/bin/xbin

所以可以像第一个命令抛出exception然后执行第二个代码。