是否可以从Android服务调用getevent?

问题描述 投票:0回答:4

是否可以从 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 上很容易。)

android android-service android-permissions
4个回答
2
投票

你可以这样做。

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后才能获取数据数据。


1
投票

您的手机必须是root才能执行getevent/sendevent命令。

一种方法是从 Play 商店安装任何终端模拟器,例如 Qute:命令控制台和终端模拟器

在终端中输入以下内容:

1)

su
(它将获得
getevent
所需的root访问权限)

2)

getevent
(或
getevent -c 8
仅输出 8 行,否则终端会被淹没)


0
投票

搜索 UIAutomator。这就是你想做的事。


0
投票

如果您使用 Termux 应用程序作为终端模拟器,则可以单击

CTRL
(位于键盘上方的命令栏中),然后单击键盘上的
c
,退出
getinput
命令(或任何其他命令)。继续将数据喷出到标准输出(屏幕))。

© www.soinside.com 2019 - 2024. All rights reserved.