From b2d672c7abf0862ec012802fe10bff1164f55f1b Mon Sep 17 00:00:00 2001 From: manchuwork Date: Tue, 14 Oct 2025 07:17:01 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A1=AB=E5=85=85=E8=A1=A8=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 7 + .../loveerror/bested/AccessibilityService.kt | 114 +++++---- .../java/com/loveerror/bested/MainActivity.kt | 99 +++++++- .../com/loveerror/bested/MyApplication.kt | 54 +++++ .../loveerror/bested/SelectAccessibility.kt | 94 ++++++++ .../bested/button/DragFloatingButton.kt | 184 ++++++++++++++ .../button/GlobalFloatingButtonManager.kt | 101 ++++++++ .../bested/handler/NormalGroupCreateForm.kt | 147 +++++++++++ .../com/loveerror/bested/handler/ZJMCCMCRM.kt | 202 ++++++++++++++++ .../bested/handler/ZJMCCMCRMState.kt | 11 + .../bested/handler/ZJMCCMCRMStateMachine.kt | 147 +++++++++++ .../com/loveerror/bested/task/TaskManager.kt | 49 ++++ .../bested/tool/AccessibilityTool.kt | 228 ++++++++++++++++++ .../bested/tool/NodeToolClassName.kt | 94 ++++++++ .../com/loveerror/bested/tool/NodeToolHint.kt | 54 +++++ .../com/loveerror/bested/tool/NodeToolText.kt | 96 ++++++++ .../com/loveerror/bested/tool/WebViewTool.kt | 72 ++++++ app/src/main/res/layout/activity_main.xml | 16 ++ 18 files changed, 1713 insertions(+), 56 deletions(-) create mode 100644 app/src/main/java/com/loveerror/bested/MyApplication.kt create mode 100644 app/src/main/java/com/loveerror/bested/SelectAccessibility.kt create mode 100644 app/src/main/java/com/loveerror/bested/button/DragFloatingButton.kt create mode 100644 app/src/main/java/com/loveerror/bested/button/GlobalFloatingButtonManager.kt create mode 100644 app/src/main/java/com/loveerror/bested/handler/NormalGroupCreateForm.kt create mode 100644 app/src/main/java/com/loveerror/bested/handler/ZJMCCMCRM.kt create mode 100644 app/src/main/java/com/loveerror/bested/handler/ZJMCCMCRMState.kt create mode 100644 app/src/main/java/com/loveerror/bested/handler/ZJMCCMCRMStateMachine.kt create mode 100644 app/src/main/java/com/loveerror/bested/task/TaskManager.kt create mode 100644 app/src/main/java/com/loveerror/bested/tool/AccessibilityTool.kt create mode 100644 app/src/main/java/com/loveerror/bested/tool/NodeToolClassName.kt create mode 100644 app/src/main/java/com/loveerror/bested/tool/NodeToolHint.kt create mode 100644 app/src/main/java/com/loveerror/bested/tool/NodeToolText.kt create mode 100644 app/src/main/java/com/loveerror/bested/tool/WebViewTool.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 169ed4d..9476ffd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,8 +2,10 @@ + diff --git a/app/src/main/java/com/loveerror/bested/AccessibilityService.kt b/app/src/main/java/com/loveerror/bested/AccessibilityService.kt index 9d5423b..c79403c 100644 --- a/app/src/main/java/com/loveerror/bested/AccessibilityService.kt +++ b/app/src/main/java/com/loveerror/bested/AccessibilityService.kt @@ -1,76 +1,84 @@ package com.loveerror.bested import android.accessibilityservice.AccessibilityService +import android.accessibilityservice.AccessibilityServiceInfo +import android.content.Intent import android.view.accessibility.AccessibilityEvent -import android.view.accessibility.AccessibilityNodeInfo +import com.loveerror.bested.handler.ZjMccmCrm +import com.loveerror.bested.tool.AccessibilityTool +import com.loveerror.bested.tool.WebViewTool class UIInspectorService : AccessibilityService() { + private lateinit var zjMccmCrm: ZjMccmCrm + override fun onServiceConnected() { + super.onServiceConnected() + + // 初始化 ZjMccmCrm + zjMccmCrm = ZjMccmCrm(this) + zjMccmCrm.initialize(this) + // 设置配置 + serviceInfo = createServiceInfo() + } + + override fun onUnbind(intent: Intent?): Boolean { + // 清理 ZjMccmCrm + zjMccmCrm.cleanup(this) + return super.onUnbind(intent) + } + override fun onAccessibilityEvent(event: AccessibilityEvent?) { when (event?.eventType) { - AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED, - AccessibilityEvent.TYPE_VIEW_FOCUSED -> { - // 获取根节点 - val root = rootInActiveWindow - if (root != null) { - // 遍历所有节点 - traverseAccessibilityNodes(root) - } + + AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED + or AccessibilityEvent.TYPE_VIEW_CLICKED + or AccessibilityEvent.TYPE_VIEW_FOCUSED + or AccessibilityEvent.TYPE_WINDOWS_CHANGED + or AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED + -> { + handleWindowChangeOpt(event) } } } - private fun traverseAccessibilityNodes(node: AccessibilityNodeInfo) { - // 处理当前节点信息 - processNodeInfo(node) + private fun handleWindowChangeOpt(event: AccessibilityEvent) { + // 窗口变化时检查 + WebViewTool.enhanceWebViewAccessibility(rootInActiveWindow) + WebViewTool.traverseAndEnhanceNodes(rootInActiveWindow) - // 遍历子节点 - for (i in 0 until node.childCount) { - val child = node.getChild(i) - if (child != null) { - traverseAccessibilityNodes(child) - } - } + // 打印界面树 + AccessibilityTool.printViewTree(rootInActiveWindow) } - private fun processNodeInfo(node: AccessibilityNodeInfo) { - // 提取节点信息 - val nodeInfo = AccessibilityNodeInfoData( - packageName = node.packageName?.toString() ?: "", - className = node.className?.toString() ?: "", - text = node.text?.toString() ?: "", - contentDescription = node.contentDescription?.toString() ?: "", - isEnabled = node.isEnabled, - isVisible = node.isVisibleToUser, - activityName = getActiveActivityName(), // 获取当前Activity名称 - viewIdResourceName = node.viewIdResourceName ?: "" // View的资源名称 - - ) - - // 可以在这里处理节点信息,比如打印日志或存储 - println("Found view: $nodeInfo") - } - - private fun getActiveActivityName(): String { - // 通过根节点获取当前Activity名称 - val root = rootInActiveWindow - return root?.packageName?.toString() ?: "" - } override fun onInterrupt() { // 服务中断时的处理 } + + private fun createServiceInfo(): AccessibilityServiceInfo { + val serviceInfo = AccessibilityServiceInfo() + + // 事件类型 + serviceInfo.eventTypes = AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED or + AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED or + AccessibilityEvent.TYPE_VIEW_FOCUSED or + AccessibilityEvent.TYPE_VIEW_CLICKED + + // 反馈类型 + serviceInfo.feedbackType = AccessibilityServiceInfo.FEEDBACK_ALL_MASK + + // 标志 + serviceInfo.flags = AccessibilityServiceInfo.DEFAULT or + AccessibilityServiceInfo.FLAG_RETRIEVE_INTERACTIVE_WINDOWS or + AccessibilityServiceInfo.FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY or + AccessibilityServiceInfo.FLAG_REQUEST_FILTER_KEY_EVENTS or + AccessibilityServiceInfo.FLAG_REPORT_VIEW_IDS + + serviceInfo.notificationTimeout = 100 + return serviceInfo + } + + } -data class AccessibilityNodeInfoData( - val packageName: String, - val className: String, - val text: String, - val contentDescription: String, - val isEnabled: Boolean, - val isVisible: Boolean, - val activityName: String, // 当前Activity名称 - val viewIdResourceName: String // View的完整资源名称 - -) diff --git a/app/src/main/java/com/loveerror/bested/MainActivity.kt b/app/src/main/java/com/loveerror/bested/MainActivity.kt index 27bbb55..125a5f9 100644 --- a/app/src/main/java/com/loveerror/bested/MainActivity.kt +++ b/app/src/main/java/com/loveerror/bested/MainActivity.kt @@ -1,15 +1,14 @@ package com.loveerror.bested import android.accessibilityservice.AccessibilityServiceInfo +import android.annotation.SuppressLint import android.content.BroadcastReceiver import android.content.ComponentName import android.content.Context import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import android.content.Intent -import android.content.IntentFilter import android.os.Build import android.provider.Settings -import android.view.accessibility.AccessibilityEvent import android.view.accessibility.AccessibilityManager import android.widget.Button @@ -18,10 +17,13 @@ import androidx.core.view.accessibility.AccessibilityManagerCompat class MainActivity : AppCompatActivity() { private lateinit var accessibilityStateReceiver: BroadcastReceiver + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) + + val btnEnableService = findViewById