3

明確にするために、このコードを使用してアプリのスーパーユーザー権限を取得し、root などにアクセスできるようにします。

    public String runProcess(String[] functs) {

    DataOutputStream dos;
    DataInputStream dis;
    StringBuffer contents = new StringBuffer("");
    String tempInput;
    Process process;

    try {
        process = Runtime.getRuntime().exec(functs);
        dos = new DataOutputStream(process.getOutputStream());
        dis = new DataInputStream(process.getInputStream());

        for (String command : functs) {
            dos.writeBytes(command + "\n");
            dos.flush();

            while ((tempInput = dis.readLine()) != null)
                contents.append(tempInput + "\n");

        }

        dos.writeBytes("exit\n");
        dos.flush();
        process.waitFor();
    } catch (Exception e) {
        e.printStackTrace();
    }

    return contents.toString();

}

問題なく動作しますが、呼び出すたびに、runProcess(new String[] { "su", "-c", "some other command" });常にスーパーユーザーの許可を求めます。アプリを起動するたびにスーパーユーザーの許可を取得するだけでよいルートアプリが市場にたくさん出回っていますが、アプリが関数を呼び出すたびにユーザーにスーパーユーザーの許可を求める必要はないと思いますSUが必要です。したがって、私の質問は、SU 関連のアクションごとに継続的に要求することなく、アプリの起動時に一度 SU 許可を与えるようにユーザーに求めるにはどうすればよいでしょうか?

編集:毎回「su」と入力せずにメソッド/Runtime.getRuntime().exec()メソッドを実行できることはわかっていますが、それはsu以外の関連アクション(つまり、exec("ps")またはexec)でのみ機能します("ls") 何かアイデアはありますか?

4

3 に答える 3

1

デバイスですでに実行されている「スーパーユーザー」アプリからの許可を探しているだけの場合は、メインの Java ファイルに次のコードが必要です。

try {
        process p= Runtime.getRuntime().exec(su);
    }

catch (IOException e) {
      e.printStackTrace();
   }

はい、デバイスがすでにルート化されている必要があることに言及する必要はありません!!!

于 2013-03-01T21:07:48.800 に答える
1

これを行う私のライブラリを使用できます。

https://code.google.com/p/roottools/

また、ライブラリを使用したくない場合は、ソースを利用できるので、コードを切り取ってアプリケーションで使用できます。

ソースへのリンクは次のとおりです。

https://code.google.com/p/roottools/source/browse/#svn%2Ftrunk%2FStable%2FRootTools-sdk3-generic%2Fsrc%2Fcom%2Fstericson%2FRootTools

于 2012-09-17T13:42:23.913 に答える
0

ルートアクセスを要求するコンソールを開くたびに、つまり、で開始するたびsuに、前のプロンプトで「もう一度聞かないでください」などのチェックを入れた場合、対応するスーパーユーザーアプリがプロンプトを表示するか、許可/拒否します。

質問(スーパーユーザーアプリ)を1回だけ行う場合は、を呼び出さずにルートコンソールを開いたままにする必要がありますdos.writeBytes("exit\n");。次に、このセッションをバックグラウンドスレッドに保持し、必要に応じて使用します。

したがって、ユーザーが最初のプロンプトで「二度と聞かないでください」をチェックするか、セッションを開いたままにしてください。

于 2012-11-17T13:23:58.267 に答える