我在运行此代码时出错,错误是“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());
}
答案 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)