Android Copy & Paste в любое текстовое поле в любом приложении

Я разрабатываю приложение для коммерческого использования с фоновым сервисом, получающим номера транспондеров (животных) от считывателя RFID через bluetooth.

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

Я уже нашел аналогичный вопрос с 2013 года, но уже не принял ответа. Все ответы на вопрос просто объяснили, как использовать ClipboardManager для копирования и вставки кода в разработанное приложение, но это не было вызвано проблемой, поскольку он пояснил в комментарии .

Самый простой сценарий, который я мог себе представить, – просто имитировать действие пасты на устройстве Android. Я бы предпочел не устанавливать стороннее приложение.

Solutions Collecting From Web of "Android Copy & Paste в любое текстовое поле в любом приложении"

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

Создайте класс, расширяющий AccessibilityService и переопределите метод onAccessibilityEvent.

 public class SampleAccessibilityService extends AccessibilityService { @Override public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent) { AccessibilityNodeInfo source = accessibilityEvent.getSource(); if (source != null) { AccessibilityNodeInfo rowNode = getRootInActiveWindow(); if (rowNode != null) { for (int i = 0; i < rowNode.getChildCount(); i++) { AccessibilityNodeInfo accessibilityNodeInfo = rowNode.getChild(i); if (accessibilityNodeInfo.isEditable() && accessibilityNodeInfo.isFocused()) { accessibilityNodeInfo.performAction(AccessibilityNodeInfoCompat.ACTION_PASTE); return; } } } } } @Override public void onInterrupt() { } } 

accessibilityNodeInfo.performAction(AccessibilityNodeInfoCompat.ACTION_PASTE) вставляет текст, скопированный в буфер обмена.

Также убедитесь, что у вас есть правильная конфигурация доступности.

config.xml

 <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" android:accessibilityFlags="flagDefault" android:accessibilityEventTypes="typeViewClicked|typeViewFocused" android:accessibilityFeedbackType="feedbackGeneric" android:notificationTimeout="0" android:canRetrieveWindowContent="true" android:description="@string/testing" /> 

Здесь android:accessibilityEventTypes="typeViewClicked|typeViewFocused" будет фильтровать события для просмотра щелчка или просмотра фокуса.

Вы также можете использовать события, основанные на пакетах, с помощью "android:packageNames" (чтобы ваш сервис не вызывался часто)

Наконец, объявите службу в манифесте,

 <service android:name=".SampleAccessibilityService" android:label="@string/app_name" android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"> <intent-filter> <action android:name="android.accessibilityservice.AccessibilityService"/> </intent-filter> <meta-data android:name="android.accessibilityservice" android:resource="@xml/config" /> </service> 

Если вы хотите, чтобы ваше приложение взаимодействовало с приложением, которое не является вашим (браузером), вам придется предоставить accessibility permissions к этому приложению. Это особый вид разрешений, позволяющий приложениям взаимодействовать с чем-то более сильным.

Есть действия по обеспечению доступности, тот, который вы ищете, – AccessibilityNodeInfoCompat.ACTION_PASTE он позволяет вам вставить пасту в сфокусированное поле.

Обратите внимание, что я рекомендую вам заменить браузер на inapp WebView и ввести значения с помощью javascript, это будет гораздо более надежное решение для вашей автоматизации. Вы можете найти дополнительную информацию о том, как запустить JS на веб-сайте здесь: Как получить возвращаемое значение из javascript в веб-браузере Android?