无法获得SuperSU的许可提示

时间:2013-02-08 17:38:49

标签: java android su rooted-device

我有一个应该执行一些root命令的应用程序。 SuperSU版本是1.04。 苏版是1.02。 Android 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);
        }
    }
}

任何人都知道为什么它会阻止所以它不显示权限窗口? 感谢。

2 个答案:

答案 0 :(得分:0)

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

为什么不简单地使用专门为执行此任务而编写的libsuperuser?它是开源的,微小的,完全注释的,有一个示例项目,甚至是在尝试执行此操作时可能遇到的document detailing the common problems

答案 1 :(得分:0)

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