web-dev-qa-db-ja.com

プログラムで再起動Androidデバイス

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でテストしています(重要な場合)。
前もって感謝します。

12
Suniel

必要な許可は、ルート化された電話(su付き)を必要とするため、再起動方法とは関係ありません。電話を再起動するには、許可を求めたが、 PowerManager#reboot

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

API 24では、アプリがデバイス所有者アプリである場合、devicePolicyManager.reboot(yourAdminComponent)を呼び出すことができます

ドキュメントを参照してください こちら

9
Luke Cauthen

試してみてください...

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

許可再起動を追加

4
sm_

通常のSDKアプリケーションから再起動することはできません。これを実行できるのは、システムファームウェア署名キーで署名されたアプリケーションのみです。この答えからコピーされた、

プログラムによるスイッチオフAndroid電話

アプリに署名するにはシステムキーが必要です。詳細については、この投稿を参照してください。

コンパイル方法Androidシステム権限を持つアプリケーション

2
KishuDroid

長い闘争の後、私は実用的なソリューションを見つけました。

システムがシリアルポートを使用している場合、以下のコマンドを実行します

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番目のコマンドを実行する場合のようにコーディングできます。

2
Yogesh Rathi

伝説的な LibSuperUser ライブラリを使用できます。

次の簡単なコードを書きます。

Shell.SU.run("reboot");
0
Lennoard Silva

あなたがやっている <permission ... />。あなたがする必要があります<USES-permission ... />

キャップは必要ありません、それを強調するだけでした。

0
tylerr147