是否可以从 Android 服务运行 getevent 并获得类似于在开发计算机上从命令提示符运行 adb 来调用 getevent 时看到的输出?当我尝试类似的事情时:
ProcessBuilder builder = new ProcessBuilder()
.command("getevent")
.redirectErrorStream(true)
.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(builder.getInputStream()));
...
我为每个设备获得的输出如下所示:
无法打开/dev/input/event[n],权限被拒绝
是否因为 Android 的安全保护而无法访问此类低级信息?在“root”设备上可以吗?
我为什么要尝试这样做: 我想在 Android 设备上记录用户的操作(触摸和手势事件),以进行可用性测试。无障碍服务似乎是一条出路,但信息不够详细。例如,对于滑动手势,我无法获取用户滑动位置的屏幕坐标。我在想从触摸屏获取低级输入可能会让我获得更详细的信息。也许有更好的方法来做到这一点? (我是 Android 世界的新手。这种事情在 Windows 上很容易。)
你可以这样做。
th = new Thread(new Runnable(){
private Process exec;
@Override
public void run() {
try {
exec = Runtime.getRuntime().exec(new String[]{"su","-c","getevent -t " + device});
InputStreamReader is = new InputStreamReader(
exec.getInputStream());
String s;
BufferedReader br = new BufferedReader(is);
while(((s = br.readLine()) != null) && run){
...
}
is.close();
exec.destroy();
} catch (IOException e) {
e.printStackTrace();
}
}
必须使用'su'来获取root权限,但是这样你无法获取到实时事件,因为有缓冲区大小为4k,只有包含4k后才能获取数据数据。
您的手机必须是root才能执行getevent/sendevent命令。
一种方法是从 Play 商店安装任何终端模拟器,例如 Qute:命令控制台和终端模拟器。
在终端中输入以下内容:
1)
su
(它将获得getevent
所需的root访问权限)
2)
getevent
(或 getevent -c 8
仅输出 8 行,否则终端会被淹没)
搜索 UIAutomator。这就是你想做的事。
如果您使用 Termux 应用程序作为终端模拟器,则可以单击
CTRL
(位于键盘上方的命令栏中),然后单击键盘上的 c
,退出 getinput
命令(或任何其他命令)。继续将数据喷出到标准输出(屏幕))。