【问题标题】:Android Copy & Paste to any text field in any applicationAndroid 复制和粘贴到任何应用程序中的任何文本字段
【发布时间】:2016-09-30 08:46:57
【问题描述】:

我正在开发一个用于商业用途的应用程序,其后台服务通过蓝牙从 RFID 阅读器获取(动物的)转发器编号。

处理收到的号码后,我想将其发送到剪贴板并将其粘贴到当前前面的任何应用程序的焦点文本字段中,在我的例子中是浏览器应用程序。 p>

我已经找到了similar question from 2013,但目前还没有接受的答案。该问题的所有答案都只是解释了如何使用ClipboardManager 在开发的应用程序中复制和粘贴代码,但正如他在comment 中澄清的那样,这并不是问题的意思。

我能想象到的最简单的场景就是在 android 设备上模拟粘贴操作。我宁愿不需要安装第三方应用。

【问题讨论】:

    标签: java android copy-paste


    【解决方案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"来基于包的事件(这样你的服务就不会被频繁调用)

    最后在 manifest 中声明服务,

    <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>
    

    【讨论】:

    • 我认为这是一个非常全面的答案,因此我将其标记为答案。它似乎完全符合我们的需要,尽管由于其他优先事项我目前无法对其进行测试。此外,我们还发现了 [BluePiano: 来自 TEC-IT 的 Android 蓝牙键盘-Wedge][tec-it.com/en/software/android/bluepiano/keyboard-wedge/… 现在可以使用。
    【解决方案2】:

    如果您希望您的应用与不属于您的应用(浏览器)进行交互,您必须为此应用提供accessibility permissions。这些是一种特殊的权限,允许应用与更敏感的事物进行交互。

    有可访问性操作,您正在寻找的是 AccessibilityNodeInfoCompat.ACTION_PASTE 它允许您在焦点字段中进行粘贴。

    请注意,我建议您将浏览器替换为 inapp WebView,并使用 javascript 注入值,这将是您自动化的更强大的解决方案。您可以在此处找到有关如何在 web 视图上运行 JS 的更多信息:How to get return value from javascript in webview of android?

    【讨论】:

    • 虽然您的回答一针见血,但我还是选择了 Govind 的回答,因为它提供了更多详细信息。
    猜你喜欢
    • 1970-01-01
    • 2011-03-05
    • 2019-07-11
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    相关资源
    最近更新 更多