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

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

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

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

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

Ответ 1

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

Создайте класс, расширяющий 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>

Ответ 2

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

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

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