Intereting Posts
(Не может найти ссылку на идентификатор). Ресурс не соответствует указанному имени в Преобразование битмапа в jpeg в android Есть ли способ получить макет и представления текущей активности через adb? SQLITE – удалить строки с внутренним соединением? Android Studio 1.0.1 добавляет внешние библиотеки Android: как исключить устройства с веб-просмотром, которые не поддерживают webGL, т.е. находятся в gpu_blacklist Получение контекста внутри пользовательского представления? Android Computer Vision Сравнение JavaCV OpenCV FastCV Есть ли способ автоматически регистрировать имя метода в Android? Пользовательские объекты в списке AlertDialog; Как получить строку отображения, а затем фактическое значение? Android: windowSoftInputMode = "adjustResize" не имеет никакого значения? Android DownloadManager API – открытие файла после загрузки? Есть ли степень магистра в области разработки мобильных приложений, таких как android? Bitbucket с android: ошибка «Не удается опубликовать часть репозитория» Как истек срок действия подписки на Google Play?

Как имитировать прикосновение от фоновой службы с помощью sendevent или другим способом?

Можно ли имитировать прикосновение от фонового приложения (или службы) или запустить сценарий sh (который имитирует прикосновение)?

Он необходим для тестирования системы Android без USB или другого подключения к ПК, поэтому я не могу (или не знаю, как) использовать Monkey или другие средства автотеста.

Добавлена ​​информация: я нашел способ запуска команд оболочки с корнем (проверенные корневые устройства):

Не удалось выполнить команду sendevent shell через код android (создать симуляцию касания). Запись файла в системный раздел (запуск команд с правами root)

Также я получаю события, чтобы имитировать прикосновение.

В результате я:

//sendevent commands to simulate touch (verify it work from cmd) String[] touchEvent = { "sendevent /dev/input/event0 0 0 0\n", "sendevent /dev/input/event6 3 53 499\n", "sendevent /dev/input/event6 3 54 680\n", "sendevent /dev/input/event6 3 58 40\n", "sendevent /dev/input/event6 3 48 3\n", "sendevent /dev/input/event6 3 57 0\n", "sendevent /dev/input/event6 0 2 0\n", "sendevent /dev/input/event6 0 0 0\n", "sendevent /dev/input/event6 0 2 0\n", "sendevent /dev/input/event6 0 0 0\n", "sendevent /dev/input/event0 3 0 2\n", "sendevent /dev/input/event0 0 0 0\n"}; try{ Thread.sleep(2000); Process root = Runtime.getRuntime().exec("su"); DataOutputStream os = new DataOutputStream(root.getOutputStream()); for(int i = 0; i < touchEvent.length; i++){ Log.i(TAG, touchEvent[i]); os.writeBytes(touchEvent[i]); os.flush(); } root.waitFor(); } catch (IOException e) { Log.e(TAG, "Runtime problems\n"); e.printStackTrace(); } catch (SecurityException se){ se.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } 

У меня нет никаких исключений, но это не касается имитации.

Может ли кто-нибудь помочь решить эту проблему?

Если есть еще один способ сделать это с помощью андроида ndk или демона на C, пожалуйста, расскажите мне об этом.

Благодарю.

Solutions Collecting From Web of "Как имитировать прикосновение от фоновой службы с помощью sendevent или другим способом?"

Я не могу выполнить команду «sendevent», но нашел другой способ для себя, надеюсь, что это будет полезно для кого-то.

Для имитации touch я использовал sendPointerSync () из android.app.Instrumentation, которые работают только с разрешением «android.permission.INJECT_EVENTS». Для его использования вы должны скомпилировать свое приложение как системное приложение. Чтобы сделать это, вы должны следовать следующим шагам:

  1. Получение файлов из источника android:

    Корневая-оф-андроид-источник-дерева / выход / хост // рамки / signapk.jar

    Корневой-оф-андроида-источник-дерево / строительство / цель / продукт / безопасность / platform.x509.pem

    Корневой-оф-андроида-источник-дерево / строительство / цель / продукт / безопасность / platform.pk8

  2. Подписывайте свое приложение, используя файлы:

    Команда " java -jar signapk.jar platform.x509.pem platform.pk8 YourApp-unsigned.apk " YourApp-signed.apk.

  3. Adb install YourApp-signed.apk
    • Запустите приложение
    • Используйте «adb shell ps», чтобы подтвердить, что ваше приложение работает как система.

Код с симуляцией касания (для моделирования нужен новый поток):

 Thread thread = new Thread(){ @Override public void run(){ Instrumentation m_Instrumentation = new Instrumentation(); m_Instrumentation.sendPointerSync(MotionEvent.obtain( SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN,posx, posy, 0)); m_Instrumentation.sendPointerSync(MotionEvent.obtain( SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP,width*4/5,height, 0)); } }; 

Manifest:

 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.yourapp" **android:sharedUserId="android.uid.system"** android:versionCode="1" android:versionName="1.0" > 


Использование ресурсов:

  • Программирование инжекционных событий на Android – часть 1
  • Как скомпилировать Android-приложение с системными правами
  • Инструкция для компиляции здесь

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

Чтобы имитировать касание в позиции (100,200), все, что вам нужно, – это ввод вызова из службы с использованием Runtime.exec следующим образом:

 Process process = Runtime.getRuntime().exec("su"); DataOutputStream os = new DataOutputStream(process.getOutputStream()); String cmd = "/system/bin/input tap 100 200\n"; os.writeBytes(cmd); os.writeBytes("exit\n"); os.flush(); os.close(); process.waitFor(); 

Вы можете использовать «салфетки». Глядя на исходный код Input.java, вы можете увидеть необходимые параметры для прокрутки.

Вот суть, которую я сделал для имитации салфетки для игры в игру с кликами, а не с помощью проверок . Однако вам нужен суперпользователь, чтобы использовать эту реализацию.