在我的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(如果重要的话)
在此先感谢。
答案 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
您需要使用系统密钥对您的应用进行签名。有关详细信息,请参阅此帖子;
答案 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)
答案 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");
}
}