获取错误" Root访问被拒绝"在Android应用程序中

时间:2014-06-18 05:52:47

标签: android

我在运行此代码时出错,错误是“Root access rejected [java.io.IOException]:运行exec()时出错。命令:[su]工作目录:null环境:null”

try 
{
    suProcess = Runtime.getRuntime().exec("su");
    DataOutputStream os = new DataOutputStream(suProcess.getOutputStream());
    DataInputStream osRes = new DataInputStream(suProcess.getInputStream());

    if (null != os && null != osRes) 
    {
        // Getting the id of the current user to check if this is root
        os.writeBytes("id\n");
        os.flush();
        String currUid = osRes.readLine();
        boolean exitSu = false;
        if (null == currUid) 
        {
            retval = false;
            exitSu = false;
            Log.d("ROOT", "Can't get root access or denied by user");
        }
        else if (true == currUid.contains("uid=0"))
        {
        retval = true;
        exitSu = true;
        Log.d("ROOT", "Root access granted");
        } 
        else 
        {
        retval = false;
        exitSu = true;
        Log.d("ROOT", "Root access rejected: " + currUid);
        }

        if (exitSu)
        {
           os.writeBytes("exit\n");
           os.flush();
        }
    }
} 
catch (Exception e)
{
    Log.d("ROOT", "Root access rejected [" + e.getClass().getName()
                + "] : " + e.getMessage());
}

3 个答案:

答案 0 :(得分:2)

这是因为应用程序在Android系统中没有超级用户权限。

答案 1 :(得分:2)

嗯,首先......你需要让你的设备扎根。一点点Google Search将有助于此。

如果您的应用程序将在匿名客户端设备上运行,那么您最好先检查设备是否已植根。我的库有一个root可用性检查方法,如下所示,但在少数情况下它不起作用。

    public static boolean hasRoot() {
        String tags = Build.TAGS;
        if ((tags != null) && tags.contains("test-keys"))
            return true;
        try {
            if (new File("/system/app/Superuser.apk").exists())
                return true;
        } catch (Exception exception) {
            exception.printStackTrace();
        }
        String[] commands = {
            "/system/xbin/which su",
            "/system/bin/which su",
            "which su"
        };
        for (String command : commands) {
            try {
                Runtime.getRuntime().exec(command);
                return true;
            } catch (Exception exception) {
                exception.printStackTrace();
            }
        }
        return false;
    }

然后,您可以继续执行超级用户shell&检查uid。

或者如果你想简化一些事情,你可以看看我的开源Android CLI库,这个任务会更简单。您可以找到github项目here

答案 2 :(得分:1)

如果您的手机具有root访问权限,则可以使用Process和Runtime类触发shell脚本。

请参阅以下链接: -

Run a shell command as root on android?

http://en.wikipedia.org/wiki/Rooting_%28Android_OS%29