ルート権限を取得されたデバイスを再起動するために使用できるソリューションを探しています。デバイスの再起動はユーザーにとって非常に貧弱な設計であることを私は知っています ここで述べたように そしてそれは実際にはアプリケーションのためではありません。主な目的は、テスト中に電話を再起動することです(私はビデオチャットアプリケーションで作業しており、すべてが南に行くときに再起動する必要がある場合があります)
ターミナル(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コード 、それは大きくて複雑なプロジェクトです:)
この問題について私を助けてくれませんか?
ありがとう。
再起動は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) {
}
}
最後に数週間の検索の後:
Runtime.getRuntime().exec(new String[]{"/system/bin/su","-c","reboot now"});
このコードは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;}
}
プログラムで再起動できないことがわかりました。
さらに、ターミナルエミュレータアプリを使用してAndroid電話でターミナルウィンドウを開き、su get#ルートアクセスのプロンプトを入力してから「#reboot」と入力すると、「not」という応答が返されます。許可されました!」
助言がありますか?
OK、気にしないで、私はそれを理解しました。 HTC電話では、SUルートアクセスを使用しても再起動コマンドは機能しません。再起動コマンドを実行するには、BUSYBOXを呼び出す必要があります。
長い苦労の末、私は実用的な解決策を見つけました。
システムでシリアルポートを使用している場合は、以下のコマンドを実行してください
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番目に実行する場合のようにコーディングできます。