任何人都可以说,adb
命令是否可以通过我的Android应用程序执行。如果可以执行,如何实施?
答案 0 :(得分:26)
你可以这样做:
Process process = Runtime.getRuntime().exec("your command");
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
不要忘记用try和catch语句包围它。
修改强>
@Phix是对的,ProcessBuilder会更好用。
答案 1 :(得分:14)
普通Android应用对通过adb
启动的流程具有不同的权限,例如,通过adb
启动的流程可以捕获屏幕,而普通应用则不允许。因此,您可以通过Runtime.getRuntime().exec()
从您的应用程序执行命令,但他们不会拥有与您从adb shell
执行时相同的权限。
答案 2 :(得分:1)
我在这篇文章中遇到了一个不同的查询,但是我之前在input
上专门在android上工作,所以我想对此做个澄清。
原因
Runtime.getRuntime().exec("adb shell input keyevent 120");
不起作用,是因为您没有删除
adb shell
ADB
部分仅在您的计算机上使用,如果您错误地安装了ADB,则该命令实际上是计算机上adb.exe文件的路径,例如
C:\XXXX\ADB Files\adb.exe shell
或
C:\ XXXX \ ADB文件\ adb shell
shell
部分告诉计算机上的ADB程序访问设备外壳程序,因此您的设备将不知道外壳程序是什么...
使用sh /path/to/commandList.sh
将执行commandList.sh中列出的逗号,因为它是一个shell脚本(Windows上的.batch文件与此类似)
您要使用的命令是
Runtime.getRuntime().exec("input keyevent 120");
但是这将导致Environment null和工作目录null,您可以通过将命令写入Shell脚本(.sh文件),然后使用
运行脚本来绕过此操作Runtime.getRuntime().exec("sh path/to/shellScript.sh");
有时不需要sh
,但我只是以防万一。
我希望这至少可以清除一些东西:)
答案 3 :(得分:0)
在Runtime.getRuntime()中调用的adb shell .exec未在shell用户下运行。它提供shell但具有相同的进程所有者用户(如u0_a44)。这就是所有命令都不起作用的原因。
答案 4 :(得分:0)
执行
Runtime.getRuntime().exec("adb shell input keyevent 120");
我收到以下错误: java.io.IOException:无法运行程序" adb":error = 13,权限被拒绝。
执行
Runtime.getRuntime().exec("adb shell input keyevent 120");
没有错误,但与此同时,我的请求不会被处理以截取屏幕截图。
我发现这是在Android的早期版本中工作,但后来它被删除了。虽然我不能在这里提供源,但为什么它不起作用。
希望这可以帮助像我这样的人尝试使用此方法在应用不在前台时截取屏幕截图。
答案 5 :(得分:0)
这就是我在 Kotlin 中所做的,我也得到命令响应
fun runShellCommand(command: String) {
// Run the command
val process = Runtime.getRuntime().exec(command)
val bufferedReader = BufferedReader(
InputStreamReader(process.inputStream)
)
// Grab the results
val log = StringBuilder()
var line: String?
line = bufferedReader.readLine()
while (line != null) {
log.append(line + "\n")
line = bufferedReader.readLine()
}
val Reader = BufferedReader(
InputStreamReader(process.errorStream)
)
// if we had an error during ex we get here
val error_log = StringBuilder()
var error_line: String?
error_line = Reader.readLine()
while (error_line != null) {
error_log.append(error_line + "\n")
error_line = Reader.readLine()
}
if (error_log.toString() != "")
Log.info("ADB_COMMAND", "command : $command $log error $error_log")
else
Log.info("ADB_COMMAND", "command : $command $log")
}