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