无法从 SuperSU 获得权限提示

Posted

技术标签:

【中文标题】无法从 SuperSU 获得权限提示【英文标题】:Cannot get permission prompt from SuperSU 【发布时间】:2013-01-24 13:15:50 【问题描述】:

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

问题是我。 我尝试了很多东西,但提示始终没有出现。

对于 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);
        
    

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

【问题讨论】:

stderr和stdout的输出是什么? 没有输出。我没有获得从 SuperSU 运行 su 的许可。 奇数。尝试清除 SuperSU 上的数据,或使用超级用户来缩小问题范围。 清除数据对 SuperSU 没有帮助。 我已移除 SuperSU 并安装了 Superuser v.3.1.3。我还将 su 更新到 3.1.1 版。现在在三星 Galaxy S3 上显示使用 su 的提示。 【参考方案1】:

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

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

【讨论】:

即使我使用 Process.getRuntime().exec("su") 它会在不请求许可的情况下阻止 我会尝试使用 libsuperuser。谢谢。 它根本没有帮助。您的代码与我的代码相似。问题仍未解决。 正如您在另一个答案中所说(由于某种原因我无法评论),是的,您需要从一个单独的线程中完成所有这些操作,正如所有文档所描述的那样。这通常仍然不会阻止弹出窗口的显示,除非您通过在 onReceive 中调用 su 来阻止接收器,您不应该这样做(也如文档所述)。【参考方案2】:

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

【讨论】:

以上是关于无法从 SuperSU 获得权限提示的主要内容,如果未能解决你的问题,请参考以下文章

如何获得system32文件夹的管理权限

VBA 从形状运行宏和屏幕提示(或工具提示)。我无法获得我发现工作的代码

魔趣安卓10 开发者模式没有root权限,怎么才能给第三方root权限?

WIN10家庭版已经获得管理员权限还是无法删除文件

怎么用命令行获得管理员权限

安装软件无法获得管理员权限?