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でテストしています(重要な場合)。
前もって感謝します。
必要な許可は、ルート化された電話(su
付き)を必要とするため、再起動方法とは関係ありません。電話を再起動するには、許可を求めたが、 PowerManager#reboot
。
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
pm.reboot(null);
API 24では、アプリがデバイス所有者アプリである場合、devicePolicyManager.reboot(yourAdminComponent)
を呼び出すことができます
ドキュメントを参照してください こちら
試してみてください...
try {
Process proc = Runtime.getRuntime().exec(new String[] { "su", "-c", "reboot" });
proc.waitFor();
} catch (Exception ex) {
Log.i(TAG, "Could not reboot", ex);
}
許可再起動を追加
通常のSDKアプリケーションから再起動することはできません。これを実行できるのは、システムファームウェア署名キーで署名されたアプリケーションのみです。この答えからコピーされた、
アプリに署名するにはシステムキーが必要です。詳細については、この投稿を参照してください。
長い闘争の後、私は実用的なソリューションを見つけました。
システムがシリアルポートを使用している場合、以下のコマンドを実行します
Runtime.getRuntime().exec(new String[]{"/system/bin/su","-c","reboot now"});
通常のポートを使用する場合は、以下のコマンドを実行します
Runtime.getRuntime().exec(new String[]{"/system/xbin/su","-c","reboot now"});
違いは/bin
および/xbin
最初のコマンドが例外をスローしてから2番目のコマンドを実行する場合のようにコーディングできます。
あなたがやっている <permission ... />
。あなたがする必要があります<USES-permission ... />
キャップは必要ありません、それを強調するだけでした。