能否在另一个Android应用程序中监视触摸编辑文本的行为?例如,当触摸特定Android应用程序中的编辑文本时,自动粘贴预先设置的某些单词。 PS. 如果不可能,是否有任何方法接收软键盘弹出广播?
能否在另一个Android应用程序中监视触摸编辑文本的行为?例如,当触摸特定Android应用程序中的编辑文本时,自动粘贴预先设置的某些单词。 PS. 如果不可能,是否有任何方法接收软键盘弹出广播?
即使 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"
/>
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));
编辑:
你不能通过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
的bundle。setText()
几乎相同。setText()
,而是想直接将文本粘贴到EditText
中,可以使用:if (nodeInfo != null) {
nodeInfo.refresh();
nodeInfo.performAction(AccessibilityNodeInfo.ACTION_PASTE);
}
AccessibiltyEvent
有一个事件类型称为TYPE_VIEW_TEXT_CHANGED
。如果你监听这个事件,那么当EditText中的文本发生改变时,你将能够得到通知,从而允许你进行必要的操作。 - Jackey