我一直在尝试很多事情,但我仍然找不到正确的方法来检查我的应用程序是否具有根访问权限。这是我尝试过的:
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 被拒绝,以上代码可以完美运行。然而,每次授予 root 权限时,它都会卡在 while 循环中。如果我删除 while 循环,它就会卡在
p.waitFor()
编辑我发现
su
命令不会产生任何输出。但我不知道如果没有输出/错误产生,为什么它仍然停留在 waitFor() 上。
要检查您的应用程序是否具有超级用户权限,您只需尝试访问根目录即可。
这就是我解决这个问题的方法:
以下方法检查是否可以列出根目录的文件。如果 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;
}
boolean isRooted = false;
boolean isRootGranted = false;
try {
Process process = Runtime.getRuntime().exec("su -c ls"); // Ask for su and list
Scanner scanner = new Scanner(process.getInputStream()).useDelimiter("\\A");
if (scanner.hasNext()) isRootGranted = true;
process.waitFor();
process.destroy();
isRooted = true;
if (isRootGranted) Toast.makeText(MainActivity.this, "ROOT granted", Toast.LENGTH_SHORT).show();
else Toast.makeText(MainActivity.this, "ROOT not granted", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
Toast.makeText(MainActivity.this, "ERROR #SU AUTORISATION\nPHONE NON ROOTED", Toast.LENGTH_SHORT).show();
}
isRooted = true(在已 root 的手机上),如果没有,则为 false。
如果授予超级用户访问权限,则 isRootGranted = true;如果没有,则为 false。
问候。