如何向 AccessibilityService 发送自定义事件?

CL *_* So 5 android accessibility-api android-service accessibilityservice android-accessibility

我的程序目的:触发服务中的 BACK 按钮

我尝试了很多方法,没有人能达到这个目的,最后我发现了AccessibilityService,它可能是实现这个功能的最可能的方法。

我创建了这个 AccessibilityService,并测试了它的工作

package com.accessibilityservice;

public class MyAccessibilityService extends AccessibilityService {
    public MyAccessibilityService() {
    }

    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {

        performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK);

    }

    @Override
    public void onInterrupt() {

    }
}

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeAllMask"
    android:accessibilityFeedbackType="feedbackSpoken"
    android:accessibilityFlags="flagDefault"
    android:canRetrieveWindowContent="true"
    android:description="desc"
    android:notificationTimeout="100"
    android:settingsActivity="com.example.android.accessibility.ServiceSettingsActivity" />
Run Code Online (Sandbox Code Playgroud)

然后我尝试转向performGlobalAction服务,但它没有执行该操作。

public class MyService extends Service {

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        MyAccessibilityService mas=new MyAccessibilityService();
        mas.performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK);
    }
}
Run Code Online (Sandbox Code Playgroud)

我还尝试以不同的方式发送自定义事件,但没有人可以发送到 MyAccessibilityService

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    //method1
    AccessibilityEvent event = AccessibilityEvent.obtain(AccessibilityEvent.TYPE_VIEW_CLICKED);
    event.setContentDescription("this is description");
    View view = new View(this);
    ViewParent parent = view.getParent();
    if (parent != null) {
        parent.requestSendAccessibilityEvent(view, event);
    }

    //method2
    AccessibilityManager manager = (AccessibilityManager) getApplicationContext().getSystemService(Context.ACCESSIBILITY_SERVICE);
    AccessibilityEvent event = AccessibilityEvent.obtain();
    event.setEventType(AccessibilityEvent.TYPE_ANNOUNCEMENT);
    event.setPackageName("p");
    event.setClassName("c");
    manager.sendAccessibilityEvent(event);
}
Run Code Online (Sandbox Code Playgroud)

如何向 MyAccessibilityService 发送自定义事件或消息,以便识别事件和消息以执行操作?

Chr*_*sCM 2

您无法按照您尝试的方式运行辅助功能服务。无障碍服务只能作为无障碍服务运行。如果您了解无障碍服务的功能,那么原因很明显。他们可以做的事情:

  • 跟踪键盘事件
  • 调查文本字段的内容
  • 任意发送动作事件

这些很容易被用于恶意目的。允许应用程序甚至标准服务启动可以执行此类操作的进程将是非常糟糕的安全性。因此,只有系统才能启动具有所有相关权限的辅助服务。它执行此操作的唯一位置是在辅助功能设置菜单中。这样,用户至少知道无障碍服务何时运行,并且可以更加谨慎地对待他们运行的这些服务的类型。

这也导致了总体答案:你不能。至少在没有运行实际的辅助功能服务,然后直接向其发送意图的情况下是这样。但用户必须自己单独启动您的服务。