如何检查我的应用是否已授予root访问权限?

时间:2019-06-01 04:34:05

标签: android root

我一直在尝试很多事情,但仍然找不到合适的方法来检查我的应用是否具有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()上。

2 个答案:

答案 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;
}