【问题标题】:Android 2.2: Reboot device programmaticallyAndroid 2.2:以编程方式重启设备
【发布时间】:2011-06-02 14:08:23
【问题描述】:

我想知道是否有办法通过代码重启设备。我试过了:

Intent i = new Intent(Intent.ACTION_REBOOT); 
i.putExtra("nowait", 1); 
i.putExtra("interval", 1); 
i.putExtra("window", 0); 
sendBroadcast(i);

并添加了REBOOT 的权限,但它仍然不起作用。

谢谢

【问题讨论】:

  • 我想我需要用“平台证书”签署我的应用程序。谁能告诉我该怎么做?我不打算在市场上发布这个应用程序,我只需要它用于我的安卓平板电脑。谢谢
  • 如果是 HTC Desire,您可以打开 GPS 并使用 OpenGL 进行一些 3D 渲染。这种组合会导致手机快速过热,进而导致重启。
  • 根据经验,如果有足够多的待处理意图排队等待您未提供服务(例如,如果您处理意图的线程因某事被阻塞),Android 2.2(或 2.3)设备将自发重启别的)。无论如何,这并不是真正可接受的重启设备的方式。
  • 有什么方法可以在不root的情况下以编程方式重启设备?
  • 在 CM12.1 Samsung 4 Jactivelte 手机上为我工作。

标签: android reboot


【解决方案1】:

如果手机root了,其实很简单:

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

第一个命令将请求超级用户权限。第二,将重启手机。 清单文件中不需要额外的权限,因为实际的重启是由执行的命令处理的,而不是应用程序。

【讨论】:

  • 我试过这个,它要求超级用户权限,一个 toast 消息显示application has been granted super user permission,然后没有发现异常,但手机没有重启。
  • 这不起作用,因为第二个命令将在与su 进程不同的进程中运行。
  • 答案没有用,因为“Runtime.getRuntime().exec("your command");"总是在不同的会话中运行。所以“su”之后的“rebo​​ot”命令不会在“su”权限下运行。所以你必须使用这个 "Runtime.getRuntime().exec(new String[]{"/system/bin/su","-c","re​​boot now"}); ",这对我有用。
  • 就像 Vishal 所说,每个 exec() 调用都在它自己的独立 shell 中运行。只是 'su' 会等待输入,所以如果你调用了 waitFor(),就像在正确答案中一样,你的应用程序就会停止(我认为)
【解决方案2】:

这似乎对我有用:

try {
        Process proc = Runtime.getRuntime().exec(new String[] { "su", "-c", "reboot" });
        proc.waitFor();
    } catch (Exception ex) {
        Log.i(TAG, "Could not reboot", ex);
    }

【讨论】:

    【解决方案3】:

    这里有一个解决方案。请记住,设备必须是 root。

    try{
        Process p = Runtime.getRuntime().exec("su");
        OutputStream os = p.getOutputStream();                                       
        os.write("reboot\n\r".getBytes());
        os.flush();
    }catch(IOException )
    

    【讨论】:

      【解决方案4】:

      仍然适用于有根设备,但如果您想要更安全(process.waitFor() 是有条件的,在单独的 try-catch 中,我们有适当的异常处理,“现在”在重新启动后添加到命令中,这对于某些设备是必需的等)和更简洁的代码,看看这个:

      Process rebootProcess = null;
      try
      {
          rebootProcess = Runtime.getRuntime().exec("su -c reboot now");
      }
      catch (IOException e)
      {
          // Handle I/O exception.
      }
      
      // We waitFor only if we've got the process.
      if (rebootProcess != null)
      {
          try
          {
              rebootProcess.waitFor();
          }
          catch (InterruptedException e)
          {
              // Now handle this exception.
          }
      }
      

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 请在链接中添加有用的代码,以防链接随着时间的推移而中断。
        【解决方案6】:

        我正在使用 Xamarin。对我来说,解决方案是:

        Java.Lang.Runtime.GetRuntime().Exec(new String[] { "/system/xbin/su", "-c", "reboot now" });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-01-04
          • 1970-01-01
          • 2011-08-09
          • 2020-12-23
          • 1970-01-01
          • 1970-01-01
          • 2011-05-31
          相关资源
          最近更新 更多