dispatchGesture 始终返回 false

问题描述 投票:0回答:1

我的服务无法启动屏幕上的点击。 AccessibilityService 的dispatchGesture 始终返回 false。如何解决这个问题?

SDK API 31

我的服务:

public class FloatingButton extends AccessibilityService {
    private WindowManager windowManager;
    private ImageView shotButton;
    private int[2] passMark = {100, 100};
    private int[2] shotMark = {200, 200};

    @Override
    public void onInterrupt() {}

    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {}

    @Override
    public void onCreate() {
        super.onCreate();

        shotButton = new ImageView(this);

        shotButton.setImageResource(R.drawable.activate);

        windowManager = (WindowManager)getSystemService(WINDOW_SERVICE);
        final LayoutParams shotButtonParams = getLayoutParams();
        shotButtonParams.x = 0;
        shotButtonParams.y = 100;

        windowManager.addView(shotButton, shotButtonParams);

        try {
            OnTouchListener shotButtonOnTouchListener = getShotButtonOnTouchListener(shotButtonParams);
            OnClickListener shotButtonOnClickListener = getShotButtonOnClickListener();

            shotButton.setOnClickListener(shotButtonOnClickListener);
            shotButton.setOnTouchListener(shotButtonOnTouchListener);
        } catch (Exception exception) {
            Log.e("SuperShot", exception.getMessage());
        }
    }

    private LayoutParams getLayoutParams() {
        final LayoutParams layoutParams = new WindowManager.LayoutParams(
            LayoutParams.WRAP_CONTENT,
            LayoutParams.WRAP_CONTENT,
            LayoutParams.TYPE_APPLICATION_OVERLAY,
            LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.TRANSLUCENT
        );

        layoutParams.gravity = Gravity.TOP | Gravity.LEFT;
        return layoutParams;
    }

    private OnClickListener getShotButtonOnClickListener() {
        return new OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.d("SuperShot", "Coordinate pass: " + String.valueOf(passMark[0]) + ", " + String.valueOf(passMark[1]));
                Log.d("SuperShot", "Coordinate shot: " + String.valueOf(shotMark[0]) + ", " + String.valueOf(shotMark[1]));

                click(passMark[0], passMark[1]);
            }
        };
    }

    private void click(int x, int y) {
        Path path = new Path();
        path.moveTo(x, y);

        StrokeDescription clickStroke = new StrokeDescription(path, 0, 10);
        Builder clickBuilder = new Builder();
        clickBuilder.addStroke(clickStroke);
        GestureDescription gesture = clickBuilder.build();
        boolean result = this.dispatchGesture(gesture, null, null);
        Log.d("SuperShot", String.valueOf(result));
    }
}

click
方法的日志显示为false,这意味着
dispatchGesture
无法完成点击。这个问题如何解决?它可能与什么有关?

Manifest.xml:

<service
    android:name="com.example.shots.FloatingButton"
    android:foregroundServiceType="specialUse"
    android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
    android:exported="false">
    <intent-filter>
        <action android:name="android.accessibilityservice.AccessibilityService" />
    </intent-filter>
    <meta-data
        android:name="android.accessibilityservice"
        android:resource="@xml/config_accessibility_service" />
</service>

config_accessibility_service.xml:

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeAllMask"
    android:accessibilityFeedbackType="feedbackAllMask"
    android:accessibilityFlags="flagDefault"
    android:canPerformGestures="true" />
java android xml accessibilityservice
1个回答
0
投票

您的代码没有任何问题,我认为由于未正确授予权限而无法正常工作。 要授予

Accessibility service
权限,请启动辅助功能设置页面并让用户启用它:

Intent openSettings = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
openSettings.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | 
Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(openSettings);

如果我错了请纠正我。

© www.soinside.com 2019 - 2024. All rights reserved.