У меня есть 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
Я хотел бы получить некоторое руководство или недвижимость для изучения, так как мои результаты не эффективны. Насколько я могу судить, это не проблема разрешения, и проблема с потоком, поскольку журналы показывают запрос разрешения (и грант), поток живет до тех пор, пока выполняется приемник (но если я отлаживать его слишком долго, то он получает убит через некоторое время [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;
}
В вашем 'Executor.execute' вы возвращаете' resp', который всегда будет false, так как вы его нигде не меняете. Так оно и должно быть? –
Также не могли бы вы указать, что такое класс 'CursorSystem' и форматировать строку' value', если это возможно? Я предполагаю, что 'CursorSystem' - ваш собственный класс.Будет полезно увидеть его полный код. –
@AkashAggarwal Да, в основном потому, что код теперь беспорядок обзоров. Код в конечном итоге достигнет 'return (suProcessRetval! = 255);' который вычисляет значение true ... Кроме того, класс 'CursorSystem' имеет более двух тысяч строк кода. Используемые основные переменные всегда задаются (по крайней мере, не равными нулю), 'CursorSystem.isAlive' является' boolean', который всегда отлаживается как 'true', большинство других показанных кодов фактически отличаются друг от друга и были упрощены для вопроса ... В то же время ошибок LogCat не возникает, не возникает «Исключение», никаких сбоев ... и ответа нет. – Bonatti