Android Copy&粘贴到任何应用程序中的任何文本字段

时间:2016-06-01 06:25:57

标签: java android copy-paste

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

处理完收到的号码后,我想将其发送到剪贴板,然后将其粘贴到当前所有应用程序的焦点文本字段,在我的情况下是浏览器应用程序。

我已经找到了comment,但现在还没有接受答案。该问题的所有答案都解释了如何使用ClipboardManager在已开发的应用程序中复制和粘贴代码,但在http://htmlpurifier.org/中澄清问题并未解决问题。

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

2 个答案:

答案 0 :(得分:8)

只是为了添加Kirill的回答并假设该应用具有“辅助功能”权限,

创建一个扩展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>

答案 1 :(得分:5)

如果您希望自己的应用与不属于自己的应用(浏览器)进行互动,则必须提供此应用accessibility permissions。这些是特殊的权限,允许应用程序与更敏感的东西进行交互。

有可访问性操作,您正在寻找的是 AccessibilityNodeInfoCompat.ACTION_PASTE它允许您将粘贴预先形成聚焦字段。

请注意,我建议您使用inapp WebView替换浏览器,并使用javascript注入值,这将为您的自动化提供更强大的解决方案。您可以在此处找到有关如何在webview上运行JS的更多信息:https://msdn.microsoft.com/en-us/library/ms675109(v=vs.85).aspx