AccessibilityService点击其他应用的按钮

新手上路,请多包涵

想做一个启动另一个APP并且点击其中一个控件的功能,使用了AccessibilityService,但是始终不会执行onAccessibilityEvent(),不知道为什么。
我在AndroidManifest.xml中设置了相关的service:

<service
   android:name=".DemoService"
   android:enabled="true"
   android:exported="true"
   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/demo_service" />
</service>

我的demo_service如下:

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeAllMask"
    android:accessibilityFlags="flagDefault"
    android:canRetrieveWindowContent="true"
    android:notificationTimeout="100"
    android:packageNames="xxx.xxx.demo" />

然后我在MainAcitivity中使用PackageManager去打开Demo app,同时我的DemoService是这样的:

public class DemoService extends AccessibilityService {

    private static final String TAG = "DemoService";

    @Override
    protected void onServiceConnected() {
        super.onServiceConnected();
        Log.wtf(TAG, "DemoService授权成功");
    }

    @Override
    public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent) {
        Log.wtf(TAG,"onAccessibilityEvent : " + accessibilityEvent.toString());
        int eventType = accessibilityEvent.getEventType();
        switch (eventType) {
            case AccessibilityEvent.TYPE_VIEW_FOCUSED:
                ServiceUtils.performClick(this,"Hello World!");
                break;
        }
    }

    @Override
    public void onInterrupt() {
        Log.wtf(TAG, "授权中断");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.wtf(TAG, "onDestroy");
    }
}

然后ScreenUtils:

public class ServiceUtils {

    private static AccessibilityNodeInfo findNodeInfoByViewId(AccessibilityNodeInfo nodeInfo, String viewId) {
        List<AccessibilityNodeInfo> list = nodeInfo.findAccessibilityNodeInfosByViewId(viewId);
        if (list == null || list.isEmpty()) {
            return null;
        }

        return list.get(0);
    }

    private static AccessibilityNodeInfo findNodeInfoByText(AccessibilityNodeInfo nodeInfo, String text) {
        List<AccessibilityNodeInfo> list = nodeInfo.findAccessibilityNodeInfosByText(text);
        if (list == null || list.isEmpty()) {
            return null;
        }

        return list.get(0);
    }

    public static void performClick(AccessibilityService service, String packageName, String viewId) {
        AccessibilityNodeInfo nodeInfo = service.getRootInActiveWindow();
        AccessibilityNodeInfo targetNode = findNodeInfoByViewId(nodeInfo, packageName + ":id/" + viewId);
        if (targetNode != null && targetNode.isClickable()) {
            targetNode.performAction(AccessibilityNodeInfo.ACTION_CLICK);
        }
    }

    public static void performClick(AccessibilityService service, String text) {
        AccessibilityNodeInfo nodeInfo = service.getRootInActiveWindow();
        AccessibilityNodeInfo targetNode = findNodeInfoByText(nodeInfo, text);
        if (targetNode != null && targetNode.isClickable()) {
            targetNode.performAction(AccessibilityNodeInfo.ACTION_CLICK);
        }
    }
}
阅读 6.3k
1 个回答
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题