0

我有一个应该执行一些根命令的应用程序。SuperSU 版本是 1.04。苏版本是1.02。安卓 4.1.1。设备是三星 Galaxy S3 - 植根。

问题是我无法从 SuperSU 获得许可提示。我尝试了很多东西,但提示从未出现。

对于 RootChecker basic、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

我不确定为什么这不起作用。让我感到奇怪的第一件事是传递Environment.getExternalStorageDirectory()exec。也许这个(路径)不允许(执行)?

为什么不简单地使用专门为执行此任务而编写的libsuperuser ?它是开源的、小巧的、完整的注释、有一个示例项目,甚至还有一个文档,详细说明了您在尝试执行此操作时可能遇到的常见问题。

于 2013-02-08T21:25:38.280 回答
0

我终于弄明白了。诀窍是在另一个线程中单独创建一个进程(执行 Runtime.getRuntime().exec("su");)。我不确定为什么会这样,但确实如此。在 RootTools 中使用了类似的方法。这解决了我的问题。

于 2013-02-11T18:01:05.853 回答