我有一个应该执行一些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);
}
}
}
任何人都知道为什么它会阻止所以它不显示权限窗口? 感谢。
答案 0 :(得分:0)
我不确定为什么这不起作用。让我感到奇怪的第一件事就是将Environment.getExternalStorageDirectory()
传递给 exec 。也许这个(路径)不被允许(从中执行)?
为什么不简单地使用专门为执行此任务而编写的libsuperuser?它是开源的,微小的,完全注释的,有一个示例项目,甚至是在尝试执行此操作时可能遇到的document detailing the common problems。
答案 1 :(得分:0)
我终于明白了。诀窍是创建一个进程(在另一个线程中单独执行Runtime.getRuntime()。exec(“su”);)。我不确定为什么会这样,但确实如此。 RootTools中使用了类似的方法。 这解决了我的问题。