Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 当用户触摸屏幕时,AccessibilityService调度手势停止_Android_Accessibilityservice - Fatal编程技术网

Android 当用户触摸屏幕时,AccessibilityService调度手势停止

Android 当用户触摸屏幕时,AccessibilityService调度手势停止,android,accessibilityservice,Android,Accessibilityservice,我正在尝试使用AccessibilityService制作一个自动点击应用程序。我使用带有AccessibilityService.GestureResultCallback的DispatchSirtation方法在屏幕上执行单击,并在onCompleted()中重复它。问题是,如果我在手势完成之前触摸屏幕,手势将被取消(onCancelled激发)。如何防止触摸屏停止我的手势 AndroidManifest.xml <?xml version="1.0" encodi

我正在尝试使用AccessibilityService制作一个自动点击应用程序。我使用带有AccessibilityService.GestureResultCallback的DispatchSirtation方法在屏幕上执行单击,并在onCompleted()中重复它。问题是,如果我在手势完成之前触摸屏幕,手势将被取消(onCancelled激发)。如何防止触摸屏停止我的手势

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.falcon.autoclick">

<application
    android:name=".base.App"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/Theme.AutoClick">
    <activity android:name=".ManageConfigActivity" />
    <activity android:name=".TestActivity" />
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <service
        android:name=".FloatingMenu"
        android:enabled="true"
        android:exported="false" />
    <service
        android:name=".AutoService"
        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/global_action_bar_service" />
    </service>
</application>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.INTERNET" />

</manifest>
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service 
xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityFeedbackType="feedbackGeneric"
android:accessibilityFlags="flagDefault"
android:canPerformGestures="true"
android:description="@string/app_name"
android:notificationTimeout="100"
android:settingsActivity=".MainActivity" />
public static final String EXTRA_ACTION = "auto_service_action";
public static final String ACTION_START_AUTO = "start_auto_click";
public static final String ACTION_STOP_AUTO = "stop_auto_click";
public static final String EXTRA_TARGET = "extra_target";

private Handler handler;
private IntervalRunnable runnable;
private CountDownTimer startTimer;
private CountDownTimer endTimer;

@Override
public void onCreate() {
    super.onCreate();
    HandlerThread handlerThread = new HandlerThread("auto-handler");
    handlerThread.start();
    handler = new Handler(handlerThread.getLooper());
}

 @Override
public int onStartCommand(Intent intent, int flags, int startId) {
    String action = intent.getAction();
    if (action != null) {
        if (action.equals(ACTION_START_AUTO)) {
            Target target = (Target) intent.getSerializableExtra(EXTRA_TARGET);
            runnable = new IntervalRunnable(target);
            handler.postDelayed(runnable, 100);
        } else if (action.equals(ACTION_STOP_AUTO)) {
            stopAuto();
        }
    }
    return super.onStartCommand(intent, flags, startId);
}

private void stopAuto() {
    if (startTimer != null) {
        startTimer.cancel();
    }
    if (endTimer != null) {
        endTimer.cancel();
    }
    handler.removeCallbacks(runnable);
    runnable = null;
}

private void startSingleTarget(Target target) {
    dispatchGesture(getGestureDescription(target), new AccessibilityService.GestureResultCallback() {
        @Override
        public void onCompleted(GestureDescription gestureDescription) {
            super.onCompleted(gestureDescription);
            LogUtil.d("stopwatch", "gesture completed");

            startTimer = new CountDownTimer(target.getDelayTime(), 1000) {
                @Override
                public void onTick(long l) {

                }

                @Override
                public void onFinish() {
                    handler.post(runnable);
                }
            }.start();
        }

        @Override
        public void onCancelled(GestureDescription gestureDescription) {
            super.onCancelled(gestureDescription);
            LogUtil.d("testttttt", "gesture cancelled");
        }
    }, null);
}

private GestureDescription getGestureDescription(Target target) {
    long duration = 0;
    GestureDescription.Builder gestureBuilder = new GestureDescription.Builder();
    Path path = new Path();
    path.moveTo(target.getCenterStartX(), target.getCenterStartY());
    if (target.isSwipe()) {
        path.lineTo(target.getCenterEndX(), target.getCenterEndY());
        duration = target.getSwipeDuration();
    } else {
        duration = target.getClickDuration();
    }

    gestureBuilder.addStroke(new GestureDescription.StrokeDescription(path,
            0,
            duration));
    return gestureBuilder.build();
}

private class IntervalRunnable implements Runnable {
    private Target target;

    public IntervalRunnable(Target target) {
        this.target = target;
    }

    @Override
    public void run() {
        startSingleTarget(target);
    }
}