web-dev-qa-db-ja.com

Runtime.exec():Androidで再起動しますか?

ルート権限を取得されたデバイスを再起動するために使用できるソリューションを探しています。デバイスの再起動はユーザーにとって非常に貧弱な設計であることを私は知っています ここで述べたように そしてそれは実際にはアプリケーションのためではありません。主な目的は、テスト中に電話を再起動することです(私はビデオチャットアプリケーションで作業しており、すべてが南に行くときに再起動する必要がある場合があります)

ターミナル(adb ShellやConnectBotなど)で再起動を使用すると、通常の ACTION_REBOOT で再起動するよりも、電話の再起動がはるかに高速であることがわかりました。とにかく。

今のところ、スーパーユーザー権限を取得することができます。

Process root = Runtime.getRuntime().exec("su");

しかし、実際の再起動はできません。 G1(HTC)とGalaxy S(Samsung)を試してみましたが、うまくいきませんでした。再起動実行可能ファイルを/system/bin/rebootに配置しました

これが私の試みのいくつかです:

Process reboot = Runtime.getRuntime().exec("/system/bin/reboot");
Process reboot = Runtime.getRuntime().exec("reboot");
Process reboot = Runtime.getRuntime().exec("su reboot"); 

私はRuntime.exec()の落とし穴について この記事 を読みましたが、私はこの場合ではないと思います。

ConnectBotを使用すると、そのようなアクションを実行できるので、それが可能であると確信しています。行って見てみるように言わないでください ConnectBotコード 、それは大きくて複雑なプロジェクトです:)

この問題について私を助けてくれませんか?

ありがとう。

16
Rob

再起動はAndroidで正常に機能します。おそらくruntime.exec()を正しく実行していません。あなたは処理する必要があります

    public static void rebootSU() {
    Runtime runtime = Runtime.getRuntime();
    Process proc = null;
    OutputStreamWriter osw = null;
    StringBuilder sbstdOut = new StringBuilder();
    StringBuilder sbstdErr = new StringBuilder();

    String command="/system/bin/reboot";

    try { // Run Script

        proc = runtime.exec("su");
        osw = new OutputStreamWriter(proc.getOutputStream());
                            osw.write(command);
                osw.flush();
        osw.close();

    } catch (IOException ex) {
        ex.printStackTrace();
    } finally {
        if (osw != null) {
            try {
                osw.close();
            } catch (IOException e) {
                e.printStackTrace();                    
            }
        }
    }
    try {
        if (proc != null)
            proc.waitFor();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    sbstdOut.append(ReadBufferedReader(new InputStreamReader(proc
            .getInputStream())));
    sbstdErr.append(ReadBufferedReader(new InputStreamReader(proc
            .getErrorStream())));
    if (proc.exitValue() != 0) {
                }
        }
16
jkhouw1

最後に数週間の検索の後:

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

このコードはSamsungGalaxy S2、S4、Sony Xperia S(LTi 26)で動作します

public static void rebootDevice()
{
    try 
    {           
        Process process = Runtime.getRuntime().exec("su");
        DataOutputStream os = new DataOutputStream(process.getOutputStream());
        os.writeBytes("reboot \n");
    } 
    catch (Throwable t) {t.printStackTrace;}
}
1
XXX

プログラムで再起動できないことがわかりました。

さらに、ターミナルエミュレータアプリを使用してAndroid電話でターミナルウィンドウを開き、su get#ルートアクセスのプロンプトを入力してから「#reboot」と入力すると、「not」という応答が返されます。許可されました!」

助言がありますか?

OK、気にしないで、私はそれを理解しました。 HTC電話では、SUルートアクセスを使用しても再起動コマンドは機能しません。再起動コマンドを実行するには、BUSYBOXを呼び出す必要があります。

1
howard

長い苦労の末、私は実用的な解決策を見つけました。

システムでシリアルポートを使用している場合は、以下のコマンドを実行してください

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

0
Yogesh Rathi