AccessibilityService是否可以在不打开应用程序的情况下对后台应用程序执行点击事件
Can AccessibilityService perform click event on Background App without opening the app
在我的 MainActivity 中,我使用 AccessibilityService 在另一个应用程序上执行点击事件,当我打开该应用程序并显示在屏幕上时它会起作用。但是我想在不打开应用程序的情况下执行点击事件,它可以打开但当前没有显示在屏幕上。
这可能吗?
public class DiaryAppAccessibilityService extends AccessibilityService {
@Override
protected void onServiceConnected() {
super.onServiceConnected();
}
@Override
public void onAccessibilityEvent (AccessibilityEvent event) {
if (getRootInActiveWindow () == null) {
return;
}
AccessibilityNodeInfoCompat rootInActiveWindow = AccessibilityNodeInfoCompat.wrap (getRootInActiveWindow());
List<AccessibilityNodeInfoCompat> messageNodeList = rootInActiveWindow.findAccessibilityNodeInfosByViewId ("com.diaryapp:id/entry");
if (messageNodeList == null || messageNodeList.isEmpty ()) {
return;
}
AccessibilityNodeInfoCompat messageField = messageNodeList.get (0);
if (messageField.getText () == null || messageField.getText ().length () == 0
|| !messageField.getText ().toString ().endsWith (getApplicationContext ().getString (R.string.diaryapp_suffix))) { // So your service doesn't process any message, but the ones ending your apps suffix
return;
}
List<AccessibilityNodeInfoCompat> sendMessageNodeInfoList = rootInActiveWindow.findAccessibilityNodeInfosByViewId ("com.diaryapp:id/send");
if (sendMessageNodeInfoList == null || sendMessageNodeInfoList.isEmpty ()) {
return;
}
AccessibilityNodeInfoCompat sendMessageButton = sendMessageNodeInfoList.get (0);
// Now fire a click on the send button
sendMessageButton.performAction (AccessibilityNodeInfo.ACTION_CLICK);
@Override
public void onInterrupt() {
}
}
XML 配置
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service
xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeWindowContentChanged"
android:accessibilityFeedbackType="feedbackSpoken"
android:accessibilityFlags="flagDefault"
android:notificationTimeout="100"
android:canRetrieveWindowContent="true"
</accessibility-service>
我删除了这个
android:packageNames="com.diaryapp"
因为我希望该服务在其他应用程序中处于活动状态并能够从那里执行点击事件。
你想做的事不是设计好的。辅助功能 API 旨在帮助残障人士与 phone 上显示的 UI 互动。
在我的 MainActivity 中,我使用 AccessibilityService 在另一个应用程序上执行点击事件,当我打开该应用程序并显示在屏幕上时它会起作用。但是我想在不打开应用程序的情况下执行点击事件,它可以打开但当前没有显示在屏幕上。
这可能吗?
public class DiaryAppAccessibilityService extends AccessibilityService {
@Override
protected void onServiceConnected() {
super.onServiceConnected();
}
@Override
public void onAccessibilityEvent (AccessibilityEvent event) {
if (getRootInActiveWindow () == null) {
return;
}
AccessibilityNodeInfoCompat rootInActiveWindow = AccessibilityNodeInfoCompat.wrap (getRootInActiveWindow());
List<AccessibilityNodeInfoCompat> messageNodeList = rootInActiveWindow.findAccessibilityNodeInfosByViewId ("com.diaryapp:id/entry");
if (messageNodeList == null || messageNodeList.isEmpty ()) {
return;
}
AccessibilityNodeInfoCompat messageField = messageNodeList.get (0);
if (messageField.getText () == null || messageField.getText ().length () == 0
|| !messageField.getText ().toString ().endsWith (getApplicationContext ().getString (R.string.diaryapp_suffix))) { // So your service doesn't process any message, but the ones ending your apps suffix
return;
}
List<AccessibilityNodeInfoCompat> sendMessageNodeInfoList = rootInActiveWindow.findAccessibilityNodeInfosByViewId ("com.diaryapp:id/send");
if (sendMessageNodeInfoList == null || sendMessageNodeInfoList.isEmpty ()) {
return;
}
AccessibilityNodeInfoCompat sendMessageButton = sendMessageNodeInfoList.get (0);
// Now fire a click on the send button
sendMessageButton.performAction (AccessibilityNodeInfo.ACTION_CLICK);
@Override
public void onInterrupt() {
}
}
XML 配置
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service
xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeWindowContentChanged"
android:accessibilityFeedbackType="feedbackSpoken"
android:accessibilityFlags="flagDefault"
android:notificationTimeout="100"
android:canRetrieveWindowContent="true"
</accessibility-service>
我删除了这个
android:packageNames="com.diaryapp"
因为我希望该服务在其他应用程序中处于活动状态并能够从那里执行点击事件。
你想做的事不是设计好的。辅助功能 API 旨在帮助残障人士与 phone 上显示的 UI 互动。