Java 无法从SuperSU获取权限提示

Java 无法从SuperSU获取权限提示,java,android,su,rooted-device,Java,Android,Su,Rooted Device,我有一个应用程序,它应该执行一些根命令。 SuperSU版本是1.04。 Su版本是1.02。 安卓4.1.1。 该设备是三星GalaxyS3的根 问题是我无法从SuperSU获得权限提示。 我试过很多方法,但提示从未出现 对于RootChecker basic、ADB和其他应用程序,它会显示。 这是我的程序——也许我做错了什么 private static String runShellCommand(String command) { DataOutputStream os = nu

我有一个应用程序,它应该执行一些根命令。 SuperSU版本是1.04。 Su版本是1.02。 安卓4.1.1。 该设备是三星GalaxyS3的根

问题是我无法从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);
        }
    }
}
有人知道为什么它会阻塞,所以不会显示权限窗口吗?
谢谢。

我不太清楚为什么这样不行。让我感到奇怪的第一件事是将
Environment.getExternalStorageDirectory()传递给exec。可能不允许(从中执行)此(路径)


为什么不简单地使用专门为执行此任务而编写的?它是开源的,很小,有完整的注释,有一个示例项目,甚至有一个您在尝试执行此操作时可能遇到的问题。

我终于找到了答案。诀窍是在另一个线程中分别创建一个进程(executeruntime.getRuntime().exec(“su”);)。我不知道为什么会这样,但确实如此。 在RootTools中也使用了类似的方法。
这就解决了我的问题。

即使我使用Process.getRuntime().exec(“su”),它也会在不请求许可的情况下阻塞,我会尝试使用libsuperuser。谢谢,一点用都没有。您的代码与我的代码类似。问题仍未解决。正如您在另一个答案中所述(出于某种原因,我无法对此作出评论),是的,您需要从一个单独的线程执行所有这些操作,正如所有文档所描述的。这通常不会阻止弹出窗口的显示,除非您通过在onReceive中调用su来阻止接收器,这(也如文档所述)是您永远不应该做的。stderr和stdout的输出是什么?没有输出。我没有从SuperSU.Odd得到运行su的许可。尝试清除SuperSU上的数据,或使用Superuser缩小问题范围。清除数据对SuperSU没有帮助。我已删除SuperSU并安装了Superuser v.3.1.3。我还将su更新为3.1.1版。现在,三星Galaxy S3上显示了使用su的提示。