gpt4 book ai didi

android - 如何检测或监控另一个 Android 应用程序中的触摸编辑文本?

转载 作者:行者123 更新时间:2023-12-04 23:58:10 25 4
gpt4 key购买 nike

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

最佳答案

可以检测何时触摸 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>

最后,您需要通过辅助功能设置启用辅助功能服务。你可以直接去那里:

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

编辑:

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

要获取 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);
}

请注意我是如何在 AccessibilityNodeInfo 上使用 performAction() 并使用操作 AccessibilityNodeInfo.ACTION_SET_TEXT 并通过键 AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE

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

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

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

关于android - 如何检测或监控另一个 Android 应用程序中的触摸编辑文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54612382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com