android - 来自相同字符串输入的意外不同结果

标签 android linux input broadcastreceiver runtime.exec

我有一个从外部源接收输入的 BroadcastReceiver。

此接收器必须充当“类鼠标”程序并将输入事件发送到系统。我有 Root 访问权限。

我的问题是,当我发送诸如 "input tap 275 410" 之类的字符串时,即使我拆分了诸如 "input"+ "tap 这样的字符串,程序也能正常运行"+ "275"+ "410",它仍然有效...

但是,当我按照需要组装字符串时:

"input "+ CursorSystem.command + ""+ coords[0] + ""+ coords[1]

然后什么也没有发生...在调试时,所有被监视的字符串都完全相同(减去位置):

value = {char[26]@830031306976}  0 = 'i' 105 1 = 'n' 110 2 = 'p' 112 3 = 'u' 117 4 = 't' 116 5 = ' ' 32 6 = 't' 116 7 = 'a' 97 8 = 'p' 112 9 = ' ' 32 10 = '2' 50 11 = '7' 55 12 = '5' 53 13 = ' ' 32 14 = '4' 52 15 = '1' 49 16 = '0' 48 17 = '\u0000' 0 18 = '\u0000' 0 19 = '\u0000' 0 20 = '\u0000' 0 21 = '\u0000' 0 22 = '\u0000' 0 23 = '\u0000' 0 24 = '\u0000' 0 25 = '\u0000' 0

我想要一些指导或属性(property)来研究,因为我的结果并不有效。据我所知,这不是权限问题,也不是线程问题,因为日志显示了权限请求(和授予),只要执行接收器,线程就会存在(但如果我调试它太久,然后它会在一段时间后被杀死 [30+ 秒])

The Receiver.onReceive:

public void onReceive(Context context, Intent intent) {
    String command = intent.getStringExtra("command");
    String touch = intent.getStringExtra("touch");
    if (Executor.isRootAvailable()) {
        Executor executor = new Executor();
        ArrayList<String> commands = new ArrayList<>();
        if (command != null) {
            if (command.length() > 0) {
                if (commands.add("input " + command)) {
                    executor.execute(commands);
                }
            }
        } else if (touch != null) {
            if (CursorSystem.isAlive) { // Always true for the executions
                CursorSystem.doInput();
                if (CursorSystem.state == CursorSystem.STATE) { // Always true for the executions
                    int[] coords = CursorSystem.coordinates;
                    if (coords != null) {
// This line is where (I guess) that the problem lies.
// CursorSystem.command is "tap", coords[0] and coords[1] is the result of (a view).getLocationOnScreen(coordinates)
// It results in a 2 positions int array with (x, y) coordinates, these values are always correct.
                        if (commands.add("input " + CursorSystem.command + " " + coords[0] + " " + coords[1])) {
                            executor.execute(commands);
                            CursorSystem.doInput();
                        } else {
                            // error...
                        }
                    } else {
                        // error...
                    }
                } else {
                    // error...
                }
            } else {
                error...
            }
        } else {
            error...
        }
    } else {
        error...
    }
}

The Executor.execute:

public final boolean execute(ArrayList<String> commands) {
    boolean resp = false;
    try {
        if (commands != null && commands.size() > 0) {
            Process suProcess = Runtime.getRuntime().exec("su");
            DataOutputStream dataOutputStream = new DataOutputStream(suProcess.getOutputStream());
            for (String currCommand : commands) {
                dataOutputStream.writeBytes(currCommand);
                dataOutputStream.writeBytes("\n");
                dataOutputStream.flush();
            }
            dataOutputStream.writeBytes("exit\n");
            dataOutputStream.flush();
            try {
                int suProcessRetval = suProcess.waitFor();
                return (suProcessRetval != 255); // Always yields 0
            } catch (Exception ex) {
                // errors...
            }
        } else {
            // error...
        }
    } catch (IOException ex) {
        Log.w(TAG, "IOException: ", ex);
    } catch (SecurityException ex) {
        Log.w(TAG, "SecurityException: ", ex);
    } catch (Exception ex) {
        Log.w(TAG, "Generic Exception: ", ex);
    }
    return resp;
}

最佳答案

对于任何感兴趣的人:

发现的问题是 CursorSystem 使用了 ImageViews,它可以帮助用户“确定”需要什么交互(以及在哪里)。在执行过程中,可以接收命令,并将图像移动到命令发生的位置,从而“接收”事件。

添加以下标志:

.LayoutParams.FLAG_NOT_FOCUSABLE
.LayoutParams.FLAG_NOT_TOUCHABLE
.LayoutParams.FLAG_LAYOUT_NO_LIMITS

允许系统不将 View 视为可交互的,以及将它们“绘制”到边界之外,以便用户可以“滑动”设备隐藏菜单,以及单击可能不存在的目标.这导致一些“启动器”程序拦截 MotionEvent,什么也不做。

命令执行成功,只是没有显示结果,导致我们将其解释为“什么都不做”。

关于android - 来自相同字符串输入的意外不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34423065/

相关文章:

java - 为什么当我点击键盘上的 "OK"按钮时,我的 EditText 被清除了?

c - strerror_r 应该允许多大的尺寸?

javascript - 使用 Jquery/Javascript 使用加/减按钮同步两个输入

c# - 表单打开时允许输入设置货币的文本框

javascript - 通过 javascript 动态添加输入

android - 在android中定义按钮事件的最佳实践

java - 无法使用java使用短信网关发送短信

android - MVVM跨+安卓 : DataBinding Context Menu options on ViewModel properties?

linux - Linux 上的 Chrome gyp 配置失败

linux - 如何重新安装最新的cmake版本?