微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Android 无障碍服务中循环

如何解决在 Android 无障碍服务中循环

我正在尝试循环执行一些辅助功能任务。

我有一个全局变量 isProcessInit,认情况下为 false,当我从 MainActivity 按下 Start 按钮时,我将其设置为 true。

这部分工作正常,但是当我运行 100 次循环时,它会不停地运行到 100 次。 我的意图函数 sendWa() 连续调用 100 次,而没有完成其余的辅助功能点击任务。

我尝试在类似于下面的协程中运行:

    runBlocking { 
        Coroutinescope(Main).launch { 
            (1..100).forEach { 
                //My loop tasks here 
            }
        }
    }

但与其他问题(例如事件有时会变为空)的相同问题。

这是我完整的无障碍服务:

class AccessibilityService : AccessibilityService() {
    private val TAG = "AccessibilityServ"
    //private var job: Job = Job()

    @RequiresApi(Build.VERSION_CODES.N)
    override fun onAccessibilityEvent(event: AccessibilityEvent?) {
        val source = event!!.source

        when (event.eventType) {
            AccessibilityEvent.TYPE_VIEW_SCROLLED -> {
            }

            AccessibilityEvent.TYPE_ANNOUNCEMENT -> {
                Log.d(TAG,"onAccessibilityEvent: Announcement")
            }
            AccessibilityEvent.TYPE_ASSIST_READING_CONTEXT -> {
                Log.d(TAG,"onAccessibilityEvent: ")
            }
            AccessibilityEvent.TYPE_GESTURE_DETECTION_END -> {
                Log.d(TAG,"onAccessibilityEvent: ")
            }
            AccessibilityEvent.TYPE_GESTURE_DETECTION_START -> {
                Log.d(TAG,"onAccessibilityEvent: ")
            }
            AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED -> {
                Log.d(TAG,"onAccessibilityEvent: Notification State Changed")
            }
            AccessibilityEvent.TYPE_TOUCH_EXPLORATION_GESTURE_END -> {
                Log.d(TAG,"onAccessibilityEvent: ")
            }
            AccessibilityEvent.TYPE_TOUCH_EXPLORATION_GESTURE_START -> {
                Log.d(TAG,"onAccessibilityEvent: ")
            }
            AccessibilityEvent.TYPE_TOUCH_INteraCTION_END -> {
                Log.d(TAG,"onAccessibilityEvent: ")
            }
            AccessibilityEvent.TYPE_TOUCH_INteraCTION_START -> {
                Log.d(TAG,"onAccessibilityEvent: ")
            }
            AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED -> {
                Log.d(TAG,"onAccessibilityEvent: ")
            }
            AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED -> {
                Log.d(TAG,"onAccessibilityEvent: ")
            }
            AccessibilityEvent.TYPE_VIEW_CLICKED -> {
            }
            AccessibilityEvent.TYPE_VIEW_CONTEXT_CLICKED -> {
            }
            AccessibilityEvent.TYPE_VIEW_FOCUSED -> {
                Log.d(TAG,"onAccessibilityEvent: ")
            }
            AccessibilityEvent.TYPE_VIEW_HOVER_ENTER -> {
                Log.d(TAG,"onAccessibilityEvent: Hover Enter")
            }
            AccessibilityEvent.TYPE_VIEW_HOVER_EXIT -> {
                Log.d(TAG,"onAccessibilityEvent: Hover Exit")
            }
            AccessibilityEvent.TYPE_VIEW_LONG_CLICKED -> {
                Log.d(TAG,"onAccessibilityEvent: ")
            }
            AccessibilityEvent.TYPE_VIEW_SELECTED -> {
                Log.d(TAG,"onAccessibilityEvent: ")
            }
            AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED -> {
                Log.d(TAG,"onAccessibilityEvent: ")
            }
            AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED -> {
                Log.d(TAG,"onAccessibilityEvent: ")
            }
            AccessibilityEvent.TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY -> {
                Log.d(TAG,"onAccessibilityEvent: ")
            }
            AccessibilityEvent.TYPE_WINDOWS_CHANGED -> {
                Log.d(TAG,"onAccessibilityEvent: Window Changed")
            }
            AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED -> {
                Log.d(TAG,"onAccessibilityEvent: Window Content Changed")

            }
            AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED -> {
                if (isProcessInit) {
                    isProcessInit = false
                    val packages = arrayOf(
                        "com.example.w4b","com.example.w4b1","com.example.w4b2","com.example.w4b3","com.example.w4b4"
                    )
                    var j = 0
                    for (i in 1..100) {
                        var currentPackage = packages[j]
                        sendWa(currentPackage)
                        Log.d("check628_forLoop","i: " + i.toString() + "; j: " + j.toString())

                        rootInActiveWindow?.apply {
                            Log.d(
                                "check628_eventPackage",event.packageName.toString() + "---" + event.className.toString() + "---" + currentPackage.toString()
                            )

                            if (event.packageName == currentPackage && event.className != null) {
                                val componentName = ComponentName(
                                    event.packageName.toString(),event.className.toString()
                                )
                                val activityInfo = tryGetActivity(componentName)
                                val isActivity = activityInfo != null
                                //if (isActivity) Log.i("CurrentActivity_",componentName.flattenToShortString())
                                //if (event.packageName == currentPackage) {
                                try {
                                    softKeyboardController.showMode = SHOW_MODE_HIDDEN

                                    val recentMediaPicker =
                                        findAccessibilityNodeInfosByViewId("$currentPackage:id/thumb")?.getorNull(
                                            0
                                        )
                                    recentMediaPicker?.performAction(AccessibilityNodeInfo.ACTION_CLICK)
                                    Thread.sleep(500)

                                    val captionLayout =
                                        findAccessibilityNodeInfosByViewId("$currentPackage:id/caption_layout")?.getorNull(
                                            0
                                        )
                                    captionLayout?.performAction(AccessibilityNodeInfo.ACTION_CLICK)
                                    Thread.sleep(500)

                                    val captionEdittext =
                                        findAccessibilityNodeInfosByViewId("$currentPackage:id/caption")?.getorNull(
                                            0
                                        )
                                    val arguments = Bundle()
                                    arguments.putString(
                                        AccessibilityNodeInfoCompat.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE,getCaptionText(this@AccessibilityService)
                                    )
                                    captionEdittext?.performAction(
                                        AccessibilityNodeInfo.ACTION_SET_TEXT,arguments
                                    )
                                    Thread.sleep(500)

                                    val sendButton =
                                        findAccessibilityNodeInfosByViewId("$currentPackage:id/send")?.getorNull(
                                            0
                                        )
                                    sendButton?.performAction(AccessibilityNodeInfo.ACTION_CLICK)
                                    Thread.sleep(500)

                                    val searchContact =
                                        findAccessibilityNodeInfosByViewId("$currentPackage:id/menuitem_search")?.getorNull(
                                            0
                                        )
                                    searchContact?.performAction(AccessibilityNodeInfo.ACTION_CLICK)
                                    Thread.sleep(500)

                                    val searchContactEdittext =
                                        findAccessibilityNodeInfosByViewId("$currentPackage:id/search_src_text")?.getorNull(
                                            0
                                        )
                                    val database =
                                        MainDatabase.getDatabase(this@AccessibilityService)
                                    val cont = database.contactsDao()
                                    val seq = cont.getSequence()[i].sequence
                                    val seqNumbers = seq?.let { cont.getSequenceCount(it) }?.size

                                    val arguments2 = Bundle()
                                    arguments2.putString(
                                        AccessibilityNodeInfoCompat.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE,seq
                                    )
                                    searchContactEdittext?.performAction(
                                        AccessibilityNodeInfo.ACTION_SET_TEXT,arguments2
                                    )
                                    Thread.sleep(1500)

                                    if (componentName.flattenToShortString() == "$currentPackage/com.example.ContactPicker") {
                                        var y = "360"
                                        for (k in 1..seqNumbers!!) {
                                            Log.d("check628_k",k.toString())
                                            sudoTap("475",y)
                                            Thread.sleep(100)
                                            y = (y.toInt() + 200).toString()
                                            Log.d("y_",y)
                                        }
//                                        sudoTap("475","560")
//                                        Thread.sleep(100)
//                                        sudoTap("475","760")
//                                        Thread.sleep(100)
//                                        sudoTap("475","960")
//                                        Thread.sleep(100)
//                                        sudoTap("475","1160")

                                        rootInActiveWindow?.findAccessibilityNodeInfosByViewId("$currentPackage:id/send")
                                            ?.getorNull(0)
                                            ?.performAction(AccessibilityNodeInfo.ACTION_CLICK)
                                    }
                                } catch (e: Exception) {
                                    e.printstacktrace()
                                }
                            }
                        }

                        if (j == 4) {
                            j = 0
                        } else {
                            j++
                        }
                    }
                }
            }
        }
    }

    private fun sendWa(packages: String) {
        Log.d("wa_sending_","$packages trying")
        try {
            val intent = Intent(Intent.ACTION_MAIN)
            intent.component = ComponentName(packages,"com.example.camera.CameraActivity")
            intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
            this.startActivity(intent)
        } catch (e: Exception) {
            Log.d("wa_sending_error","$packages not found")
        }
    }

    override fun onServiceConnected() {
        super.onServiceConnected()
        val info = serviceInfo
        info.eventTypes = AccessibilityEvent.TYPES_ALL_MASK
        info.flags =
            AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS or
                    AccessibilityServiceInfo.FLAG_REPORT_VIEW_IDS or
                    AccessibilityServiceInfo.FLAG_RETRIEVE_INteraCTIVE_WINDOWS or
                    AccessibilityServiceInfo.FLAG_RETRIEVE_INteraCTIVE_WINDOWS or
                    AccessibilityServiceInfo.FLAG_REQUEST_FILTER_KEY_EVENTS

        info.FeedbackType = AccessibilityServiceInfo.FeedBACK_GENERIC
        info.notificationTimeout = 100
        info.packageNames = arrayOf(
            "com.example.w4b","com.android.settings"
        )
        this.serviceInfo = info
    }

    override fun onInterrupt() {
        Todo("Not yet implemented")
    }

    @RequiresApi(Build.VERSION_CODES.N)
    fun touchTo(x: Float,y: Float) {
        val swipePath = Path()
        swipePath.moveto(x,y)
        swipePath.lineto(x,y)
        val gestureBuilder = GestureDescription.Builder()
        gestureBuilder.addstroke(strokeDescription(swipePath,50))
        dispatchGesture(gestureBuilder.build(),null,null)
    }


    private fun sudoTap(x: String,y: String) {
        runSudoCommand("input tap $x $y")
    }

    private fun tryGetActivity(componentName: ComponentName): ActivityInfo? {
        return try {
            packageManager.getActivityInfo(componentName,0)
        } catch (e: PackageManager.NameNotFoundException) {
            null
        }
    }
}

有没有办法处理这个事件,只有在完成任务后才能再次运行循环..

提前致谢。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。