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

时间:2013-03-13 20:11:12

标签: android android-service android-permissions

是否可以从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的安全保护,是否无法访问此类低级别信息?是否可以在“有根”的设备上使用?

为什么我要这样做: 我想在Android设备上记录用户的操作(触摸和手势事件)以进行可用性测试。可访问性服务似乎是要走的路,但信息不够详细。例如,对于滑动手势,我无法获取用户滑动位置的屏幕坐标。我在想从触摸屏获取低级输入可能会让我获得更详细的信息。也许有更好的方法来做到这一点? (我是Android界的新手。在Windows上这种事情很简单。)

3 个答案:

答案 0 :(得分:1)

你可以这样做。

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 :(得分:0)

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

答案 2 :(得分:0)

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

一种方法是从游戏商店安装任何终端模拟器,如Qute: Command Console & Terminal Emulator

在终端输入以下内容:

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

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