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

标签 android android-service accessibilityservice accessibility-api 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" />

然后我尝试移动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);
    }
}

我也尝试以不同的方式发送自定义事件,但没有人可以发送到 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);
}

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

最佳答案

您无法以您尝试的方式运行辅助功能服务。无障碍服务只能作为无障碍服务运行。如果您了解无障碍服务的功能,这里的原因是显而易见的。他们可以做的事情:

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

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

    这也导致了总体答案:你不能。至少在不运行实际的可访问性服务的情况下,然后直接向该服务发送 Intent 。但是用户必须自己单独启动您的服务。

    关于android - 如何向 AccessibilityService 发送自定义事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35739334/

    相关文章:

    android - Oreo 不支持的字体

    android - Workmanger : Getting Exception kotlinx. coroutines.JobCancellationException 的长时间运行 Worker 问题:Kotlin 中的 CoroutineWorker 中的作业被取消

    Android IntentService 从未被调用

    Android通过方向改变维护服务连接

    Android kitkat "ok google"功能,启用任何应用程序的通知可访问性后禁用

    c# - 在 Android 上启用 AccessibilityService 后触摸屏事件停止工作

    android - 如何在android中为recyclerview创建圆形布局管理器

    android - 使用 Messengers 和 Binders 进行进程间通信

    android - 如果它是 android 无障碍服务的用户名字段,有没有办法检查来源?

    java - 'Click Counter' Android 应用程序的重置按钮