2015-12-22 4 views
13

У меня есть 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; 
} 
+0

В вашем 'Executor.execute' вы возвращаете' resp', который всегда будет false, так как вы его нигде не меняете. Так оно и должно быть? –

+0

Также не могли бы вы указать, что такое класс 'CursorSystem' и форматировать строку' value', если это возможно? Я предполагаю, что 'CursorSystem' - ваш собственный класс.Будет полезно увидеть его полный код. –

+0

@AkashAggarwal Да, в основном потому, что код теперь беспорядок обзоров. Код в конечном итоге достигнет 'return (suProcessRetval! = 255);' который вычисляет значение true ... Кроме того, класс 'CursorSystem' имеет более двух тысяч строк кода. Используемые основные переменные всегда задаются (по крайней мере, не равными нулю), 'CursorSystem.isAlive' является' boolean', который всегда отлаживается как 'true', большинство других показанных кодов фактически отличаются друг от друга и были упрощены для вопроса ... В то же время ошибок LogCat не возникает, не возникает «Исключение», никаких сбоев ... и ответа нет. – Bonatti

ответ

3

Для тех, кто заинтересован:

Проблема найдена в том, что CursorSystem использовали ImageViews, которые помогли пользователю "мишень", что взаимодействие желательно (и где). Во время выполнения команда может быть получена, и изображение будет перемещено туда, где будет выполняться команда, таким образом, «получив» событие.

Добавления следующих флагов:

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

Разрешены система, чтобы не учитывать мнения как interactable, а также «рисовать» их за пределы, так что пользователь может «Размах» Устройство скрытого меню , а также нажмите на цель, которая потенциально может не существовать. Это заставило некоторые программы «Launcher» перехватить MotionEvent и ничего не делать.

Команда выполнялась успешно, только результат не показывался, и заставил нас интерпретировать ее как «ничего не делать».

-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(); 
    } 
+0

Хотя это может ответить на вопрос ОП, размещение твердых блоков кода без каких-либо объяснений не служит образовательной цели. Пожалуйста, улучшите свой ответ, объяснив, почему этот код является решением, или если он основан на том, что изменилось и по какой причине. –

+0

Я прокомментировал свою строку кода: «// удаляет символы NUL и обратную косую черту + u0000», этого недостаточно? –

+0

@LinhNguyen Как указано в вопросе, аргумент String равен. Нет нулевых символов или нежелательных символов (например, зазор, новая строка, фид строки и т. Д.). Проблема не входит в код, поскольку «исправление», данное приложению, не изменило ни службу, ни класс внутри нее. – Bonatti

Смежные вопросы