如何在另一个Android应用程序中检测或监视触摸edittext?

时间:2019-02-10 00:58:42

标签: android

是否可以在另一个Android应用程序中监控触摸式编辑文本的行为?例如,在特定的android应用中触摸编辑文本时,会自动粘贴之前设置的一些单词。 PS。如果不可能,有什么方法可以接收软键盘弹出广播?

1 个答案:

答案 0 :(得分:0)

即使EditText属于另一个应用程序,也可以检测到何时触摸了EditText。但是,这只能通过辅助功能服务来完成。

首先,您需要在xml文件夹中创建一个serviceconfig.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:description="@string/accessibility_permission_desc"
    android:accessibilityEventTypes="typeAllMask"
    android:accessibilityFeedbackType="feedbackGeneric"
    android:notificationTimeout="100"
    android:canRetrieveWindowContent="true"
    />

第二,您需要创建一个AccessibilityService,如下所示:

public class MyAccessibilityService extends AccessibilityService {

    ...

    @Override
    public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent) {
        switch(accessibilityEvent.getEventType()) {
            case AccessibilityEvent.TYPE_VIEW_CLICKED:
            case AccessibilityEvent.TYPE_VIEW_FOCUSED:
                try {
                    Class className = Class.forName(accessibilityEvent.getClassName().toString());

                    if (EditText.class.isAssignableFrom(className)) {
                        // An EditText was Clicked or Focused
                        // Use other methods from the accessibilityEvent to do what 
                        // you need to do
                    }
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }                 
                break;
        }
    } 

    ...

}

第三,您需要将服务添加到AndroidManifest.xml

<service android:name=".MyAccessibilityService"
    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/serviceconfig" />
</service>

最后,您需要通过“辅助功能设置”启用AccessibilityService。您可以通过以下方式直接转到那里:

startActivity(new Intent(android.provider.Settings.ACTION_ACCESSIBILITY_SETTINGS));

编辑:

您无法通过EditText获得AccessibilityEvent。相反,您需要获取AccessibilityNodeInfo并通过此EditText执行典型的AccessibilityNodeInfo功能。

要获取AccessibilityNodeInfo,您需要调用以下代码:

AccessibilityNodeInfo nodeInfo = accessibilityEvent.getSource()==null ? null : accessibilityEvent.getSource();

然后,您可以执行诸如setText()之类的特定操作,如下所示:

if (nodeInfo != null) {
    nodeInfo.refresh();
    Bundle bundle = new Bundle();
    bundle.putString(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, newString);
    nodeInfo.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, bundle);
}

请注意我如何在performAction()上使用AccessibilityNodeInfo并使用动作AccessibilityNodeInfo.ACTION_SET_TEXT并与密钥AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE一起分发。

这几乎与在EditText视图上调用setText()相同。

如果您不想setText(),而只想直接将文本粘贴到EditText,则可以使用:

if (nodeInfo != null) {
    nodeInfo.refresh();
    nodeInfo.performAction(AccessibilityNodeInfo.ACTION_PASTE);
}