我一直在尝试很多事情,但仍然找不到合适的方法来检查我的应用是否具有root用户访问权限。这是我尝试过的:
private boolean isRootGranted() {
Process p;
BufferedReader reader = null;
String line;
try {
p = Runtime.getRuntime().exec("su");
reader = new BufferedReader(new InputStreamReader(p.getErrorStream()));
while( (line = reader.readLine()) != null) {
System.out.println(line);
}
int result;
try {
result = p.waitFor();
} catch (InterruptedException e) {
e.printStackTrace();
Toast.makeText(this, "You need to grant root access", Toast.LENGTH_SHORT).show();
return false;
}
if(result != 0) {
Toast.makeText(this, "You need to grant root access", Toast.LENGTH_SHORT).show();
return false;
}
return true;
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(this, "Your device is not rooted", Toast.LENGTH_SHORT).show();
return false;
} finally {
try {
if(reader != null) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
如果设备没有root或root被拒绝,则上面的代码可以完美地工作。但是,每当根被授予时,它就会卡在while循环中。如果我删除了while循环,它将卡在p.waitFor()
编辑,我发现su
命令不会产生任何输出。但是我不知道为什么如果没有输出/错误产生,它仍然停留在waitFor()上。
答案 0 :(得分:0)
最后从这个线程https://stackoverflow.com/a/39420232/11488790
找到了一个绝妙的答案其他需要答案的人请参考上面的链接。
答案 1 :(得分:0)
要检查您的应用程序是否具有超级用户权限,您只需尝试访问根目录即可。
我是这样解决这个问题的:
以下方法检查是否可以列出根目录的文件。如果 shell 命令 (cd / && ls
) 返回空字符串,则您的应用没有 root 访问权限并且该方法返回 false。
public boolean hasRootAccess() {
try {
java.util.Scanner s = new java.util.Scanner(Runtime.getRuntime().exec(new String[]{"/system/bin/su","-c","cd / && ls"}).getInputStream()).useDelimiter("\\A");
return !(s.hasNext() ? s.next() : "").equals("");
} catch (IOException e) {
e.printStackTrace();
}
return false;
}