无法从 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 获得权限提示的主要内容,如果未能解决你的问题,请参考以下文章
VBA 从形状运行宏和屏幕提示(或工具提示)。我无法获得我发现工作的代码