以编程方式重启android设备

时间:2015-10-07 06:03:49

标签: android reboot

在我的Android应用程序中,我想在按钮点击时重新启动我的Android设备。 但它不起作用。
到目前为止我已经这样做了。

ImageButton restartmob = (ImageButton) this.findViewById(R.id.restartmob);
    restartmob.setOnClickListener(new ImageButton.OnClickListener() {
        @Override
        public void onClick(View v) {
            Process proc = null;            
            try {
               //proc = Runtime.getRuntime().exec(new String[] { "su", "-c", "reboot" });
                 proc = Runtime.getRuntime().exec(new String[]{"/system/bin/su","-c","reboot now"});
                proc.waitFor();
            } catch (Exception ex) {
                Log.i(TAG, "Could not reboot", ex);
            }
        }
    });

我还在清单文件中添加了以下权限。

<permission android:name="android.permission.REBOOT"/>

当我点击图像按钮重新启动时,我得到以下异常。

java.io.IOException: Error running exec(). Command: [/system/bin/su, -c, reboot now] 
Working Directory: null Environment: null   
at java.lang.ProcessManager.exec(ProcessManager.java:211)   
at java.lang.Runtime.exec(Runtime.java:173)
at java.lang.Runtime.exec(Runtime.java:128)
at com.android.onlinepayment.activity.SystemSubMenuActivity$1.onClick(SystemSubMenuActivity.java:49)
at android.view.View.performClick(View.java:5184)   
at android.view.View$PerformClick.run(View.java:20910)  
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5942)    
at java.lang.reflect.Method.invoke(Native Method)   
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1388  
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183)
Caused by: java.io.IOException: No such file or directory   
at java.lang.ProcessManager.exec(Native Method)
at java.lang.ProcessManager.exec(ProcessManager.java:209)
... 13 more

我的代码出了什么问题?请帮帮我。
有关信息,我正在测试android Lollipop(如果重要的话) 在此先感谢。

9 个答案:

答案 0 :(得分:15)

您需要的权限与重启方法无关,因为您的方法需要有根电话(su)。要重新启动手机,请按照您的要求获得权限,但请拨打PowerManager#reboot

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

答案 1 :(得分:9)

在API 24上,如果您的应用是设备所有者应用,则可以致电:devicePolicyManager.reboot(yourAdminComponent)

请参阅文档here

答案 2 :(得分:3)

试试这个......

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

添加权限重启

答案 3 :(得分:2)

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

Programmatically switching off Android phone

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

How to compile Android Application with system permissions

答案 4 :(得分:2)

经过长时间的努力,我找到了可行的解决方案。

如果系统使用串口,​​则执行以下命令,

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

如果使用普通端口,则在命令

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

差异仅为 /bin /xbin

  

所以代码就像第一个命令抛出异常然后执行第二个。

答案 5 :(得分:0)

您可以使用传奇的LibSuperUser库。

写下这个简单的代码:

Shell.SU.run("reboot");

答案 6 :(得分:0)

你在做<permission ... />。 您需要执行<USES-permission ... />

不需要上限,只是强调它。

答案 7 :(得分:0)

try {//   It worked for me on Android 7.0
            Runtime.getRuntime().exec(arrayOf("/system/bin/su", "-c", "reboot now"))
        }catch (e:Exception){
            Log.e(TAG,e.message)
            e.printStackTrace()
        }

答案 8 :(得分:0)

试试这个代码 -

第一个导入包

import com.google.android.things.device.DeviceManager;

创建函数并添加一些异常

public void StartReboot() throws IllegalStateException, RuntimeException, SecurityException {

创建对象

      try {
         DeviceManager deviceManager = DeviceManager.getInstance();

开始重启

         deviceManager.reboot();

捕获异常

      } catch(IllegalStateException ex) {
        OnError("Underlying system service is not ready.");
      } catch(RuntimeException ex) {
        OnError("Underlying system service encountered an error.");
      } catch(SecurityException ex) {
        OnError("Calling context does not have com.google.android.things.permission.REBOOT permission");
      }
    }