36

谁能说,是否adb可以通过我的android应用程序执行命令。如果可以执行,如何执行?

4

7 回答 7

31

你可以这样做:

Process process = Runtime.getRuntime().exec("your command");
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(process.getInputStream()));

不要忘记用 try and catch 语句包围它。

编辑:

@Phix 是对的,使用ProcessBuilder会更好。

于 2012-11-14T15:32:02.483 回答
14

普通安卓应用程序对通过 启动的进程具有不同的权限adb,例如,adb允许通过 启动的进程捕获屏幕,而普通应用程序则不允许。因此,您可以通过 执行应用程序中的命令Runtime.getRuntime().exec(),但它们不会拥有与您从adb shell.

于 2014-04-10T10:14:09.510 回答
5

我发现这篇文章是为了寻找一个不同的查询,但我之前专门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 Files\adb shell

shell部分告诉您计算机上的 ADB 程序访问设备外壳,因此您的设备也不知道外壳是什么......

Usingsh /path/to/commandList.sh将执行 commandList.sh 中列出的命令,因为它是一个 shell 脚本(Windows 上的 .batch 文件类似)

您要使用的命令是

Runtime.getRuntime().exec("input keyevent 120");     

但是,这将导致环境为空且工作目录为空,您可以通过将命令写入 shell 脚本( .sh 文件)然后运行脚本来绕过此问题

Runtime.getRuntime().exec("sh path/to/shellScript.sh");   

有时sh不需要,但我只是使用它以防万一。

我希望这至少能解决一些问题:)

于 2018-11-26T11:04:14.453 回答
1

在 Runtime.getRuntime().exec 中调用的 adb shell 未在 shell 用户下运行。它提供 shell 但具有相同的进程所有者用户(如 u0_a44)。这就是所有命令都不起作用的原因。

于 2017-05-26T10:07:42.137 回答
1

这就是我在 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")
}

于 2021-03-05T20:43:47.570 回答
0

执行

Runtime.getRuntime().exec("adb shell input keyevent 120");

我收到以下错误:java.io.IOException:无法运行程序“adb”:错误=13,权限被拒绝。

执行

Runtime.getRuntime().exec("adb shell input keyevent 120");

没有错误,但同时,我的截屏请求没有得到处理。

我发现这在早期版本的 android 中工作,但后来它被删除了。虽然我无法在这里提供它为什么不起作用的来源。

希望这可以帮助像我这样尝试使用这种方法在应用程序不在前台时截取屏幕截图的人。

于 2018-04-04T12:41:26.183 回答
0
Process process = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(process.getOutputStream());
string cmd = "/system/bin/input keyevent 23\n";
os.writeBytes(cmd);

手机必须root。在这里,我执行了 adb 命令“input keyevent 23”。请记住,当您通过 su 执行 adb 命令时,您不需要添加“adb shell input keyevent 23”

于 2021-12-30T09:07:00.103 回答