0

いくつかのルートコマンドを実行する必要があるアプリがあります。SuperSUのバージョンは1.04です。Suバージョンは1.02です。Android4.1.1。デバイスはSamsungGalaxyS3-に根ざしています。

問題は、SuperSUから許可プロンプトを取得できないことです。多くのことを試しましたが、プロンプトが表示されません。

RootCheckerベーシック、ADB、その他のアプリの場合は表示されます。これが私の手順です-多分私は何か間違ったことをしています。

private static String runShellCommand(String command) {
    DataOutputStream os = null;
    Process process = null;
    try {
        String [] env = {"PATH=/sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin"}; 
        process = Runtime.getRuntime().exec("su", env, Environment.getExternalStorageDirectory() );
        os = new DataOutputStream(process.getOutputStream());

        InputStreamHandler err = new InputStreamHandler(process.getErrorStream(), false);
        InputStreamHandler out = new InputStreamHandler(process.getInputStream(), false);

        os.writeBytes(command + "\n");
        os.flush();

        os.writeBytes(EXIT);
        os.flush();
        os.close();
        Log.d(LOGTAG, "Waiting on: " + process.waitFor());

        String errOut = err.getOutput();
        String stdOut = out.getOutput(); 

        Log.d(LOGTAG, "Exit code: " + process.exitValue());
        Log.d(LOGTAG, command + " erroutput: [" + errOut + "]");
        Log.d(LOGTAG, command + " output: [" + stdOut + "]");
        if (errOut != null && !errOut.equals(""))
            return errOut;
        else if (stdOut != null&& !stdOut.equals(""))
            return stdOut;
        else 
            return null;
    } catch (Exception e) {
        Log.e(LOGTAG, "runShellCommand error: ", e);
        return null;
    } finally {
        try {
            if (os != null) {
                os.close();
            }
            if (process != null) {
                Log.d(LOGTAG, "Exit val: " + process.exitValue());
                process.destroy();
            }
        } catch (Exception ignored) {}
    }
}

InputStreamハンドラーは次のとおりです。

private static class InputStreamHandler extends Thread {
    private final InputStream stream;
    private final boolean devNull;
    StringBuffer output;

    public String getOutput() {
        return output.toString();
    }

    InputStreamHandler(InputStream stream, boolean devNull) {
        this.devNull = devNull;
        this.stream = stream;
        output = new StringBuffer();
        start();
    }

    @Override
    public void run() {
        try {
            if (devNull) {
                while (stream.read() != -1) {}
            } else {
                BufferedReader br = new BufferedReader(new InputStreamReader(stream));
                while (true) {
                    String line = br.readLine();
                    if (line == null) {
                        Log.d(LOGTAG, "Ended with reading!");
                        br.close();
                        return;
                    }
                    output.append(line);
                }
            }
        } catch (IOException ignored) {
            Log.e(LOGTAG, "Error", ignored);
        }
    }
}

許可ウィンドウが表示されないようにブロックする理由を誰かが知っていますか?ありがとう。

4

2 に答える 2

0

私はついにそれを理解しました。秘訣は、別のスレッドでプロセス(Runtime.getRuntime()。exec( "su");)を個別に作成することです。なぜこれが機能するのかわかりませんが、機能します。同様の方法がRootToolsでも使用されます。これで私の問題は解決しました。

于 2013-02-11T18:01:05.853 に答える
0

なぜこれが機能しないのか正確にはわかりません。私が奇妙だと思う最初のことは、 execEnvironment.getExternalStorageDirectory()に渡すことです。たぶん、これ(パス)は(から実行するために)許可されていませんか?

このタスクを実行するために特別に作成されたlibsuperuserを単純に使用してみませんか?これはオープンソースで、小さく、完全にコメントされており、サンプルプロジェクトがあり、この操作を実行しようとしたときに発生する可能性のある一般的な問題を詳述したドキュメントもあります。

于 2013-02-08T21:25:38.280 に答える