android代码adb命令,Android通过代码执行adb shell命令

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

tinycap通过adb shell命令直接抓取录音文档,现在转换为通过代码方式执行

// exec命令

String command = "tinycap /sdcard/1111.wav -D 0 -d 0 -r 48000 -c 2 -b 16";

try {

Process process = Runtime.getRuntime().exec(command);

} catch (IOException e) {

e.printStackTrace();

}

printMessage(process.getInputStream());

printMessage(process.getErrorStream());

// ctrl+c

try {

Process p = Runtime.getRuntime().exec("kill -2 " + getTinyCapPID());

} catch (IOException e) {

e.printStackTrace();

}

private static void printMessage(final InputStream input) {

new Thread(new Runnable() {

@Override

public void run() {

Reader reader = new InputStreamReader(input);

BufferedReader bf = new BufferedReader(reader);

String line = null;

try {

while((line=bf.readLine())!=null) {

System.out.println(line);

}

} catch (IOException e) {

e.printStackTrace();

}

}

}).start();

}

因为adb shell后,执行tinymix打开相关流,然后tinycap开始录音,然后ctrl+c,结束录音,录音文档是ok的,可以播放。

那么我们的解决思路是去提前停止tinycap所对应的进程(Runtime.getRuntime().exec执行这行命令时产生的进程)

尝试:直接拿到这个进程p.destroy().失败了,虽然tinycap停止了,但是生成的wav音频文档播放不了。

这就说明,ctrl+c这个操作实际并不是强杀进程。

上网查询了解到ctrl+c实际发送了SIGINT这个信号。那么我们尝试着去模拟这个信号,用kill命令可以。

kill-2 pid。注意是-2,正好对应SIGINT,kill命令的相关参数可以上网查询。

那么第一步,我们要先拿到tinycap的pid。

尝试了几种方法:反射,stackoverflow上找到的 fail

public static int getPid(Process p) {

int pid = -1;

try {

Field f = p.getClass().getDeclaredField("pid");

f.setAccessible(true);

pid = f.getInt(p);

f.setAccessible(false);

} catch (Throwable e) {

pid = -1;

}

return pid;

}

链接:https://stackoverflow.com/questions/13055794/android-runtime-getruntime-exec-get-process-id

虽然用的字段是pid,但是实测实际获取的却是ppid,绝望。java.lang.Process这个类往上追,追到ProcessImpl再到UNIXProcess.除了pid这个看起来有用的字段,没有别的可以获取pid的字段了。所以fail

用RunningTaskInfo fail

实测机器是8.0上只能拿到systemui,launcher和当前应用。所以fail用RunningAppProcessInfo fail

只要AndroidManifest申明权限android.permission.REAL_GET_TASKS,并且是系统应用,就可以拿到所有应用的pid。

但是注意了,是应用。都是类似com.android.settings的进程,但是tinycap这种Runtime.getRuntime().exec生成的进程不在此列。所以fail模拟ps | grep tinycap 去获取pid success

public String getTinyCapPID() {

java.lang.Process psProcess = null;

try {

psProcess = Runtime.getRuntime().exec("sh");

} catch (IOException e) {

e.printStackTrace();

}

DataOutputStream out = new DataOutputStream(psProcess.getOutputStream());

InputStream is = psProcess.getInputStream();

try {

out.writeBytes("ps | grep 'tinycap' | cut -c 10-15n");

out.writeBytes("psn");

out.flush();

} catch (IOException e) {

e.printStackTrace();

}

try {

out.writeBytes("exitn");

out.flush();

psProcess.waitFor();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

String re="";

try {

if (is.read() != 0) {

byte firstByte = (byte) is.read();

int available = is.available();

byte[] characters = new byte[available + 1];

characters[0] = firstByte;

is.read(characters, 1, available);

re = new String(characters);

}

} catch (IOException e) {

e.printStackTrace();

}

return re;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值