我有一个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
我想要一些指导或财产来学习,因为我的结果没有效果。据我所知,这不是一个权限问题,也不是一个线程问题,因为Logs显示了权限请求(和授权),只要Receiver正在执行,该线程就会存在(但如果我调试它太久了,然后它会在一段时间后被杀死[30+秒])
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...
}
}
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;
}
答案 0 :(得分:3)
对任何有兴趣的人:
发现的问题是CursorSystem
使用了ImageViews,它帮助用户“瞄准”#34;需要什么样的互动(以及在哪里)。在执行期间,可以接收命令,并将图像移动到命令发生的位置,从而接收&#34;接收&#34;事件。
添加以下标志:
.LayoutParams.FLAG_NOT_FOCUSABLE
.LayoutParams.FLAG_NOT_TOUCHABLE
.LayoutParams.FLAG_LAYOUT_NO_LIMITS
允许系统不将视图视为可交互的,以及&#34; draw&#34;他们超出界限,以便用户可以轻扫&#34;设备隐藏菜单,以及单击可能不存在的目标。这导致一些&#34; Launcher&#34;拦截MotionEvent的程序,什么都不做。
命令正在成功执行,没有显示结果,导致我们将其解释为&#34;什么都不做&#34;。
答案 1 :(得分:-1)
替换
if (commands.add("input " + CursorSystem.command + " " + coords[0] + " " + coords[1])) {
executor.execute(commands);
CursorSystem.doInput();
}
带
String newCommand = "input " + CursorSystem.command + " " + coords[0] + " " + coords[1];
newCommand = newCommand.replace("\u0000", "").replace("\\u0000", "");// removes NUL chars and backslash+u0000
if(commands.add(newCommand)){
executor.execute(commands);
CursorSystem.doInput();
}