Скраб SeekBar с доступностью услуг - PullRequest
1 голос
/ 06 апреля 2020

Я пытаюсь очистить панель поиска стороннего приложения с помощью Accessibility Services. Это то, что я использую для очистки.

 val arguments = Bundle()
 arguments.putFloat(AccessibilityNodeInfo.ACTION_ARGUMENT_PROGRESS_VALUE, 50.0.toFloat())
 seekBarNode?.performAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_SET_PROGRESS.id, arguments)

Поскольку я очищаю видео, позиция SeekBar изменяется , но содержимое не меняется .

Кто-нибудь знает, в чем здесь проблема? Или есть какие-либо альтернативы для очистки стороннего SeekBar с помощью сервисов специальных возможностей?

Кроме того, я прочитал о GestureDescription для выполнения считываний. Но я не знаю, как использовать это для выполнения очистки SeekBar.

1 Ответ

0 голосов
/ 10 апреля 2020

Попробуйте кликнуть по центру панели поиска с помощью dispatchGesture:

fun AccessibilityService.tapCenterOfNode(node: AccessibilityNodeInfo, onDone: (Boolean) -> Any){
    this.dispatchPath(
        drawPath = pathOnPoint(node.centerInScreen()),
        pathDuration = 10,
        onDone = { 
            success -> Log.d("dispatch", "success? $success")
        }
    )
}

fun AccessibilityService.dispatchPath(drawPath: Path, pathDuration: Long, onDone: (Boolean) -> Any) {
    val stroke = GestureDescription.StrokeDescription(drawPath, 0, pathDuration)
    val gesture = GestureDescription.Builder().addStroke(stroke).build()

    this.dispatchGesture(gesture, object : AccessibilityService.GestureResultCallback() {
        override fun onCompleted(gestureDescription: GestureDescription) {
            super.onCompleted(gestureDescription)
            onDone(true)
        }

        override fun onCancelled(gestureDescription: GestureDescription) {
            super.onCancelled(gestureDescription)
            onDone(false)
        }
    }, null)
}

fun AccessibilityNodeInfo.centerInScreen(): Pair<Float, Float> = 
    Pair(this.getBoundsInScreen().exactCenterX(), this.getBoundsInScreen().exactCenterY())

fun AccessibilityNodeInfo.getBoundsInScreen(): Rect {
    val rect = Rect()
    getBoundsInScreen(rect)
    return rect
}

fun pathOnPoint(point: Pair<Float, Float>) = Path().apply {
    val (x, y) = point
    moveTo(x, y)
    lineTo(x, y)
}
...