如何解决在 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 举报,一经查实,本站将立刻删除。