判断手机是否root的方法
/*
* 判断手机是否root
* */
public boolean getRootAhth() {
Process process = null;
DataOutputStream os = null;
try {
process = Runtime.getRuntime().exec("su");
os = new DataOutputStream(process.getOutputStream());
os.writeBytes("exit\n");
os.flush();
int exitValue = process.waitFor();
if (exitValue == 0) {
return true;
} else {
return false;
}
} catch (Exception e) {
return false;
} finally {
try {
if (os != null) {
os.close();
}
process.destroy();
} catch (Exception e) {
e.printStackTrace();
}
}
}
上面的方法有的时候可能会判断不出来手机是否已经root了,可能会抛出下面这个异常:java.io.IOException Error running exec().Command: [su] Working Directory: null Environment: null,造成这个的原因可能是因为(1)/system/xbin/su不存在 (2)/system/xbin/su权限问题 (3)/system/xbin/su不允许第三方应用获取root权限
点击打开链接(这个链接有详细的说明了这个问题)
如果上面的判断方法没有用可以使用这个方法来判断
//判断机器 Android是否已经root,即是否获取root权限
public boolean isRootSystem() {
File f = null;
final String kSuSearchPaths[] = {"/system/bin/", "/system/xbin/", "/system/sbin/", "/sbin/", "/vendor/bin/"};
try {
for (int i = 0; i < kSuSearchPaths.length; i++) {
f = new File(kSuSearchPaths[i] + "su");
if (f != null && f.exists()) {
Log.v("msg", "路径: " + kSuSearchPaths[i]);
return true;
}
}
} catch (Exception e) {
return false;
}
return false;
}
如果判断出手机已经root了,接下来能做的事只有你想不到的,没有你做不到的,这里我们将实现几个小功能
(1)手机截图的实现
/**
* 手机截图
*
* @return 返回截图的路径
*/
public static String getScreenshot() {
Process process = null;
String filePath = "mnt/sdcard/" + System.currentTimeMillis() + ".png";
try {
process = Runtime.getRuntime().exec("su");
PrintStream outputStream = null;
outputStream = new PrintStream(new BufferedOutputStream(process.getOutputStream(), 8192));
outputStream.println("screencap -p " + filePath);
outputStream.flush();
outputStream.close();
process.waitFor();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (process != null) {
process.destroy();
}
}
if (new File(filePath).exists()) {
return filePath + true;
} else {
return filePath + false;
}
}
注意:上面的方法不一定能成功,会碰到和前面一样的问题,这个时候换其他方法来实现也是一样的
public boolean exeSh() {
String sh = "su -c " + "screencap -p " + "mnt/sdcard/" + System.currentTimeMillis() + ".png";
ProcessBuilder pb = new ProcessBuilder(SH_PATH);
// 设置shell的当前目录
pb.directory(new File("/"));
Process process = null;
BufferedReader in = null;
PrintWriter out = null;
try {
process = pb.start();
// 获取输入流,可以通过它获取SHELL的输出。
in = new BufferedReader(new InputStreamReader(
process.getInputStream()));
// 获取输出流,可以通过它向SHELL发送命令。
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(
process.getOutputStream())), true);
// 弹出superuser等授权管理
out.println(sh);
out.println("exit");
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
try {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
process.destroy();
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}
这个方法最后得出的结果是一样的,都是对手机界面进行截图
如果你要实现静默安装的话,只要将String sh的值换成"su -c pm install -r sdcard/news.apk"即可,sdcard/news.apk为你要装的apk的路径
如果要实现卸载的功能,将String sh的值换成"su -c pm uninstall packagename' ,packagename为你应用的包名