{"id":35891248,"url":"https://github.com/Krosxx/Android-Auto-Api","last_synced_at":"2026-01-15T16:00:42.185Z","repository":{"id":41466953,"uuid":"271532653","full_name":"Krosxx/Android-Auto-Api","owner":"Krosxx","description":"安卓无障碍服务Api, 为了简化无障碍服务使用，并使用 Kotlin 以提供简洁的Api。","archived":false,"fork":false,"pushed_at":"2025-06-18T09:24:15.000Z","size":5623,"stargazers_count":558,"open_issues_count":9,"forks_count":99,"subscribers_count":10,"default_branch":"master","last_synced_at":"2025-06-25T22:38:50.247Z","etag":null,"topics":["accessibility","accessibility-automation","accessibility-service","android","android-library","automation","kotlin","kotlin-coroutines","uiautomator","uiautomator2"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Krosxx.png","metadata":{"files":{"readme":"ReadMe.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2020-06-11T11:48:38.000Z","updated_at":"2025-06-25T03:21:41.000Z","dependencies_parsed_at":"2025-06-18T09:39:04.492Z","dependency_job_id":null,"html_url":"https://github.com/Krosxx/Android-Auto-Api","commit_stats":null,"previous_names":["krosxx/android-auto-api","vove7/android-accessibility-api"],"tags_count":38,"template":false,"template_full_name":null,"purl":"pkg:github/Krosxx/Android-Auto-Api","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Krosxx%2FAndroid-Auto-Api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Krosxx%2FAndroid-Auto-Api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Krosxx%2FAndroid-Auto-Api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Krosxx%2FAndroid-Auto-Api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Krosxx","download_url":"https://codeload.github.com/Krosxx/Android-Auto-Api/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Krosxx%2FAndroid-Auto-Api/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28458636,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-15T15:17:48.816Z","status":"ssl_error","status_checked_at":"2026-01-15T15:16:50.052Z","response_time":62,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["accessibility","accessibility-automation","accessibility-service","android","android-library","automation","kotlin","kotlin-coroutines","uiautomator","uiautomator2"],"created_at":"2026-01-09T08:00:27.098Z","updated_at":"2026-01-15T16:00:42.179Z","avatar_url":"https://github.com/Krosxx.png","language":"Kotlin","funding_links":[],"categories":["Kotlin"],"sub_categories":[],"readme":"# Android-Accessibility-Api\n\n[![](https://jitpack.io/v/Krosxx/Android-Auto-Api.svg)](https://jitpack.io/#Krosxx/Android-Auto-Api)\n\n中文 | [English](ReadMe_EN.md)\n\n\u003e 安卓无障碍服务Api, 为了简化无障碍服务使用，并使用 Kotlin 以提供简洁的Api。  \n\n**交流q群：1042251052**, 可有偿提供难度问题解决方案。\n\n\u003cbr\u003e\n\n**由于4.0版本代码进行重构，之前接入的项目需要修改 `import package`, 并且 `\nimplementation 'com.github.Krosxx.Android-Accessibility-Api:accessibility-api:4.0.0'`。UiAutomator 可参考 [Demo App](app)。**  \n**最新 library : `implementation 'com.github.Krosxx:Android-Auto-Api:Tag'`**\n\n**下面代码仅供参考，具体以 demo 中为准**\n\n\n\u003cdetails\u003e\n\u003csummary\u003e🥤请喝阔乐 🥤（点击展开）\u003c/summary\u003e\n\n\u003cbr/\u003e\n如果您觉得此仓库对您有帮助，欢迎给我捐赠～\n\n\u003cbr/\u003e\n\u003cimg width=200 src=\"screenshots/alp.jpg\"\u003e\u003c/img\u003e\n\u003cimg width=224 src=\"screenshots/wx.png\"\u003e\u003c/img\u003e\n\n\u003c/details\u003e\n\n## 基础导航\n\n(图片加载过慢可到 [Gitee](https://www.gitee.com/Vove/Android-Accessibility-Api) 查看)\n\n\u003cimg width=300 src=\"screenshots/action_nav.gif\"\u003e\u003c/img\u003e\n\n\n\u003cdetails\u003e\n\u003csummary\u003e查看代码\u003c/summary\u003e\n\n```kotlin\n//无障碍服务声明 未开启会跳转设置页面提示开启服务，并抛出异常 终止执行\nrequireBaseAccessibility()\ntoast(\"下拉通知栏..\")\ndelay(1000)\ntoast(\"快捷设置..\")\n//操作之间需要适当延时等待\ndelay(1000)\n//下拉通知栏快捷设置\nquickSettings()\ndelay(1000)\n//返回操作\nback()\ndelay(500)\n//返回操作\nback()\ndelay(1000)\n//电源菜单\npowerDialog()\ndelay(500)\nback()\ndelay(1000)\n//进入最近任务页面\nrecents()\ndelay(1000)\nback()\ndelay(1000)\n//Home 按键 / 返回桌面\nhome()\ndelay(100)\n```\n\n\u003c/details\u003e\n\n更多操作:\n\n| 方法          | 说明                        |\n| ------------- | --------------------------- |\n| lockScreen()  | 锁屏，需要Android P         |\n| screenShot()  | 触发系统截屏，需要Android P |\n| splitScreen() | 触发系统分屏，需要Android P |\n\n\n\n## 视图检索\n\n### 提取文字\n\n\u003cimg width=300 src=\"screenshots/action_pick_text.gif\"\u003e\u003c/img\u003e\n\n```kotlin\nrequireBaseAccessibility()\n//使用 ScreenTextFinder() 来搜索屏幕上的文字\nval ts = ScreenTextFinder().find().joinToString(\"\\n\\n\")\n\nwithContext(Dispatchers.Main) {\n    AlertDialog.Builder(act).apply {\n        setTitle(\"提取文字：\")\n        setMessage(ts)\n        show()\n    }\n}\n```\n\n### 视图搜索\n\n1. 提供一个基础类 `ViewFinder`， 并封装一个 `ViewFinderWithMultiCondition` 来指定搜索条件，实现快速搜索;查看所有方法：[view_finder_api.kt](accessibility-api/src/main/java/cn/vove7/andro_accessibility_api/api/view_finder_api.kt)\n1. 最新添加 `SmartFinder`，支持多条件(AND, OR)搜索，扩展性极高  \n\n`ViewFinder` 主要方法：\n\n**注意：在`3.0.0`及之后版本，搜索方法需在协程作用域内使用，若需要`java`内调用请使用`2.1.1`版本**\n\n|                             方法                             |                             说明                             |\n| :----------------------------------------------------------: | :----------------------------------------------------------: |\n|   findFirst(includeInvisible: Boolean = false): ViewNode?    | 立即搜索，返回满足条件的第一个结果\u003cbr\u003eincludeInvisible: 是否包含不可见元素 |\n| findAll(includeInvisible: Boolean = false): Array\\\u003cViewNode\u003e |               立即搜索，返回满足条件的所有结果               |\n|         waitFor(waitMillis: Long = 30000): ViewNode?         |   等待搜索，在指定时间内循环搜索（视图更新），超时返回null   |\n|      require(waitMillis: Long = WAIT_MILLIS): ViewNode       |                       等待超时抛出异常                       |\n|         findByDepths(vararg depths: Int): ViewNode?          |                       指定深度索引搜索                       |\n|                       exist(): Boolean                       |                是否存在 (findFirst() != null)                |\n|                      attachCoroutine()                       |              支持协程调用，支持cancel()打断搜索              |\n\n**示例1：** 等待 Chrome 打开 \u003e 展开菜单\n\n\u003cimg width=300 src=\"screenshots/action_chrome.gif\"\u003e\u003c/img\u003e\n\n```kotlin\n//等待无障碍开启 默认时间30s，超时将抛出异常\nwaitBaseAccessibility()\ntoast(\"start chrome after 1s\")\ndelay(1000)\n//打开Chrome\nval targetApp = \"com.android.chrome\"\nact.startActivity(act.packageManager.getLaunchIntentForPackage(targetApp))\n//等待页面\nif (\n    waitForApp(targetApp, 5000).also {\n        toast(\"wait \" + if (it) \"success\" else \"failed\")\n    }\n) {\n    //id 搜索，点击打开菜单\n    withId(\"menu_button\").tryClick()\n}\n```\n\n**示例2：** 文本操作\n\n\u003cimg width=300 src=\"screenshots/action_text_op.gif\"\u003e\u003c/img\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e查看代码\u003c/summary\u003e\n\n```kotlin\nrequireBaseAccessibility()\n//editor() 指定编辑框\neditor().require().apply { // this is ViewNode\n    repeat(5) {\n        //追加文本\n        appendText(\".x\")\n        delay(500)\n    }\n    delay(1000)\n    //清空文本\n    text = \"\"\n    delay(1000)\n    //设置文本\n    text = \"123456\"\n    delay(1000)\n    //选择文本\n    setSelection(0, 5)\n    delay(1000)\n\t//清除选择\n    clearSelection()\n    //失去焦点\n    clearFocus()\n}\n```\n\u003c/details\u003e\n\n\n2. 提供自定义搜索条件\n\n搜索所有可点击的视图：\n\n\u003cimg width=300 src=\"screenshots/action_custom_finder.gif\"\u003e\u003c/img\u003e\n\n\n```kotlin\nrequireBaseAccessibility()\n//自定义条件搜索\nval s = findAllWith { it: AccessibilityNodeInfo -\u003e \n    it.isClickable\n}.joinToString(\"\\n\\n\")\n\nwithContext(Dispatchers.Main) {\n    AlertDialog.Builder(act).apply {\n        setTitle(\"可点击节点：\")\n        setMessage(s)\n        show()\n    }\n}\n```\n\n3. SmartFinder\n\n\u003e 扩展性极高，支持多条件(AND, OR)搜索\n\u003e\n\u003e 更多已支持的条件见：[SmartFinderConditions.kt](accessibility-api/src/main/java/cn/vove7/andro_accessibility_api/viewfinder/SmartFinderConditions.kt)\n\n```kotlin\n//SF 为 SmartFinder 缩写\nSF.text(\"SmartFinder测试\").findFirst()\n//等效：\nSF.where(_text eq \"SmartFinder测试\").findFirst()\n\n//搜索 文本为123 或者 id为text1\nSF.text(\"123\").or().id(\"text1\").findFirst()\n```\n\n原始AND，OR\n\n```kotlin\n//搜索 所有isChecked\nSF.where { \n    it.isChecked\n}.find()\n\nSF.where(IdCondition(\"view_id\")).or(RTextEqCondition(\"[0-9]+\")).find()\n//等效：\nSF.id(\"view_id\").or().matchText(\"[0-9]+\").find()\n```\n\n支持Group\n\n```kotlin\n// (text==\"111\" \u0026\u0026 desc==\"111\") || (text==\"222\" \u0026\u0026 desc==\"222\")\nSF.where(SF.text(\"111\").desc(\"111\"))\n            .or(SF.text(\"222\").desc(\"222\"))\n            .find()\n```\n\n中缀表达式\n```kotlin\n//使用中缀表达式\n(SF where text(\"1111\") or text(\"2222\")\n        and id(\"111\") or longClickable()).findAll()\n```\n\n\n3. 协程支持\n\n添加 `attachCoroutine` 方法，搜索等待可及时中断\n\n```kotlin\nfun run(act: Activity) = runBlocking {\n    val outterJob = coroutineContext[Job]\n    val searchJob = GlobalScope.async {\n        val t = SF.attachCoroutine()//attach当前协程上下文，需要主动调用\n          .containsText(\"周三\").waitFor(10000)\n        AlertDialog.Builder(act).apply {\n            setMessage(t.toString())\n            withContext(Dispatchers.Main) {\n                show()\n            }\n        }\n    }\n    searchJob.invokeOnCompletion {\n        outterJob?.cancel()\n    }\n    delay(3000)\n    //取消搜索测试\n    searchJob.cancel()\n}\n```\n\n4. 条件扩展\n\n\u003e 封装自定义搜索条件，使调用起来更简洁\n\u003e 库中搜索条件全部实现位于 `SmartFinderConditions.kt`\n\n例如 定义使用正则匹配Node文本\n\n##### Step 1.\n```kotlin\nclass TextMatcherCondition(private val regex: String) : MatchCondition {\n\t//此处注意直接创建Regex，防止在搜索时重复创建；另外可直接检查正则表达式有效性\n    private val reg = regex.toRegex()\n    override fun invoke(node: AcsNode) =\n        node.text?.toString()?.let {\n            reg.matches(it)\n        } ?: false\n}\n```\n\n此时，已经可以这样使用：\n\n```kotlin\nSF.where(TextMatcherCondition(\"[0-9]+\")).findAll()\n```\n追究简洁，可进行扩展方法：\n\n##### Step 2.\n```kotlin\nfun ConditionGroup.matchText(reg: String) = link(TextMatcherCondition(reg))\n```\n\n之后可简化调用\n\n```kotlin\nSF.matchText(\"[0-9]+\").findAll()\n```\n\n\n## 视图节点(ViewNode)\n\n根据`ViewFinder`搜索得到 `ViewNode`，可进行的操作详见接口：[ViewOperation.kt](accessibility-api/src/main/java/cn/vove7/andro_accessibility_api/viewnode/ViewOperation.kt)\n\n## 全局手势\n\n全局手势可以点击/长按任意坐标，执行路径手势。\n\n### 示例\n\n\u003cimg width=300 src=\"screenshots/action_gesture.gif\"\u003e\u003c/img\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e查看代码\u003c/summary\u003e\n\n```kotlin\nclass DrawableAction : Action {\n    override val name: String\n        get() = \"手势画图 - Rect - Circle - Oval\"\n\n    @RequiresApi(Build.VERSION_CODES.N)\n    override suspend fun run(act: Activity) {\n        requireBaseAccessibility()\n        requireGestureAccessibility()\n        act.startActivity(Intent(act, DrawableActivity::class.java))\n        toast(\"1s后开始绘制，请不要触摸屏幕\")\n        delay(1000)\n\n        //设置相对屏幕 非必须\n        setScreenSize(500, 500)\n        //指定点转路径手势\n        gesture(\n            2000L, arrayOf(\n                100 t 100,\n                100 t 200,\n                200 t 200,\n                200 t 100,\n                100 t 100\n            )\n        )\n        delay(800)\n        //点击clear按钮\n        withText(\"clear\").tryClick()\n        //使用Path\n        drawCircle()\n        delay(800)\n        withText(\"clear\").tryClick()\n        drawOval()\n    }\n\n    @RequiresApi(Build.VERSION_CODES.N)\n    fun drawCircle() {\n        val p = Path().apply {\n            //此处路径坐标为绝对坐标\n            addOval(RectF(500f, 500f, 800f, 800f), Path.Direction.CW)\n        }\n        gesture(2000L, p) {\n            toast(\"打断\")\n        }\n    }\n\n    //AdapterRectF 会根据设置的相对屏幕大小换算\n    @RequiresApi(Build.VERSION_CODES.N)\n    fun drawOval() {\n        val p = Path().apply {\n            //使用AdapterRectF 会根据设置的相对屏幕尺寸将坐标转换\n            addOval(AdapterRectF(200f, 200f, 300f, 300f), Path.Direction.CW)\n        }\n        gesture(2000L, p)\n    }\n\n    infix fun \u003cA, B\u003e A.t(that: B): Pair\u003cA, B\u003e = Pair(this, that)\n}\n\n```\n\n\u003c/details\u003e\n\n### Api文档\n\n**手势Api全部需要Android N+；代码必须执行于非主线程**\n\n\u003cdetails\u003e\n\u003csummary\u003e展开查看\u003c/summary\u003e\n\n| 方法                                                         | 说明                        |\n| :----------------------------------------------------------- | :-------------------------- |\n| fun setScreenSize(width: Int, height: Int)                   | 设置屏幕相对坐标            |\n| fun gesture(\u003cbr\u003e     duration: Long, \u003cbr\u003e     points: Array\u003cPair\u003cInt, Int\u003e\u003e,\u003cbr\u003e     onCancel: Function0\u003cUnit\u003e? = null \u003cbr\u003e): Boolean | 根据点坐标生成路径 执行手势 |\n| fun gesture(\u003cbr\u003e     duration: Long,\u003cbr\u003e     path: Path,\u003cbr\u003e     onCancel: Function0\u003cUnit\u003e? = null \u003cbr\u003e): Boolean | 根据Path执行手势            |\n| fun gestureAsync(\u003cbr\u003e     duration: Long,\u003cbr\u003e     points: Array\u003cPair\u003cInt, Int\u003e\u003e \u003cbr\u003e) | 异步执行手势                |\n| fun gestures(\u003cbr\u003e     duration: Long,\u003cbr\u003e     ppss: Array\u003cArray\u003cPair\u003cInt, Int\u003e\u003e\u003e,\u003cbr\u003e     onCancel: Function0\u003cUnit\u003e? = null \u003cbr\u003e): Boolean | 多路径手势                  |\n| fun click(x: Int, y: Int)                                | 点击； x,y 相对坐标         |\n| fun longClick(x: Int, y: Int)                                | 长按； x,y 相对坐标         |\n| fun swipe(x1: Int, y1: Int, x2: Int, y2: Int, dur: Int)      | 两点间滑动                  |\n| fun scrollUp(): Boolean                                      | 向上滑动                    |\n| fun scrollDown(): Boolean                                    | 向下滑动                    |\n\n\u003c/details\u003e\n\n\n\n## 使用\n\n由于部分系统版本启动支持手势的无障碍服务会造成系统卡顿(掉帧)，所以本库分为两个服务来设计（若无需手势功能，可不实现手势服务）。\n\n### 引入 Android-Accessibility-Api\n\n1. Add it in your root build.gradle at the end of repositories:\n\n```groovy\nallprojects {\n\trepositories {\n\t\t//...\n\t\tmaven { url 'https://jitpack.io' }\n\t}\n}\n```\n\n2. Add the dependency\n\n```groovy\ndependencies {\n\timplementation 'com.github.Krosxx:Android-Auto-Api:Tag'\n}\n```\n\nthe TAG is [![](https://jitpack.io/v/Krosxx/Android-Auto-Api.svg)](https://jitpack.io/#Krosxx/Android-Auto-Api)\n\n**注意：在`3.0.0`及之后版本，搜索方法需在协程作用域内使用，若需要`java`内调用请使用`2.1.1`版本**\n\n\n### 创建你的服务\n\n#### 基础服务\n\n用来支持 布局检索，视图操作\n\n1. 定义你的 BaseAccessibilityService\n\n\u003cdetails\u003e\n\u003csummary\u003e展开查看 BaseAccessibilityService \u003c/summary\u003e\n\n```kotlin\nclass BaseAccessibilityService : AccessibilityApi() {\n\n    //启用 页面更新 回调\n    override val enableListenAppScope: Boolean = true\n    \n    //页面更新回调\n    override fun onPageUpdate(currentScope: AppScope) {\n        Log.d(\"TAG\", \"onPageUpdate: $currentScope\")\n    }\n}\n```\n\n\u003c/details\u003e\n\n2. 服务注册\n\n```xml\n\u003cservice\n    android:name=\".service.BaseAccessibilityService\"\n    android:description=\"@string/base_ser_desc\"\n    android:label=\"BaseService Demo\"\n    android:permission=\"android.permission.BIND_ACCESSIBILITY_SERVICE\"\u003e\n    \u003cintent-filter\u003e\n        \u003caction android:name=\"android.accessibilityservice.AccessibilityService\" /\u003e\n    \u003c/intent-filter\u003e\n    \u003cmeta-data\n        android:name=\"android.accessibilityservice\"\n        android:resource=\"@xml/base_accessibility_config\" /\u003e\n\u003c/service\u003e\n```\n\n3. base_accessibility_config.xml\n\n\u003cdetails\u003e\n\u003csummary\u003e点击展开 res/xml/base_accessibility_config.xml\u003c/summary\u003e\n\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\n\u003caccessibility-service xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:accessibilityEventTypes=\"typeWindowStateChanged\"\n    android:accessibilityFeedbackType=\"feedbackAllMask\"\n    android:accessibilityFlags=\"flagIncludeNotImportantViews|flagReportViewIds|flagRetrieveInteractiveWindows|flagRequestEnhancedWebAccessibility\"\n    android:canRetrieveWindowContent=\"true\"\n    android:description=\"@string/base_ser_desc\"\n    android:notificationTimeout=\"10\"\n    android:canRequestEnhancedWebAccessibility=\"true\"\n    android:settingsActivity=\".MainActivity\"\n    android:summary=\"基础导航/视图检索操作\"/\u003e\n\u003c!--    android:canRequestFilterKeyEvents=\"true\"--\u003e\n\u003c!--flagRequestFilterKeyEvents--\u003e\n```\n\n其中 `android:accessibilityEventTypes=\"typeWindowStateChanged\"` 可能会在视图搜索有延迟刷新视图树的问题， \n可使用 `android:accessibilityEventTypes=\"typeAllMask\"` 替换\n\n\u003c/details\u003e\n\n#### 手势服务\n\n\u003e 用于执行手势，Android N+可用\n\n1. 定义 GestureAccessibilityService\n\n\u003cdetails\u003e\n\u003csummary\u003e展开查看 GestureAccessibilityService \u003c/summary\u003e\n\n```kotlin\nclass GestureAccessibilityService : AccessibilityService() {\n    override fun onCreate() {\n        super.onCreate()\n        //must call\n        AccessibilityApi.gestureService = this\n    }\n    override fun onDestroy() {\n        super.onDestroy()\n        //must call\n        AccessibilityApi.gestureService = null\n    }\n    override fun onInterrupt() {}\n    override fun onAccessibilityEvent(event: AccessibilityEvent?) {}\n}\n```\n\n\u003c/details\u003e\n\n2. 服务注册\n\n```xml\n\u003cservice\n    android:name=\".service.GestureAccessibilityService\"\n    android:description=\"@string/ges_ser_desc\"\n    android:label=\"Gesture Service Demo\"\n    android:permission=\"android.permission.BIND_ACCESSIBILITY_SERVICE\"\u003e\n    \u003cintent-filter\u003e\n        \u003caction android:name=\"android.accessibilityservice.AccessibilityService\" /\u003e\n    \u003c/intent-filter\u003e\n    \u003cmeta-data\n        android:name=\"android.accessibilityservice\"\n        android:resource=\"@xml/gesture_accessibility_config\" /\u003e\n\u003c/service\u003e\n```\n\n3. gesture_accessibility_config.xml\n\n\u003cdetails\u003e\n\u003csummary\u003e点击展开 res/xml/gesture_accessibility_config.xml\u003c/summary\u003e\n\n\n和基础服务配置区别仅为 `android:canPerformGestures=\"true\"`\n\n```xml\n\u003caccessibility-service xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:accessibilityEventTypes=\"\"\n    android:accessibilityFeedbackType=\"\"\n    android:accessibilityFlags=\"\"\n    android:canPerformGestures=\"true\"\n    android:canRetrieveWindowContent=\"false\"\n    android:description=\"@string/ges_ser_desc\"\n    android:notificationTimeout=\"10\"\n    android:packageNames=\"\"\n    android:settingsActivity=\".MainActivity\"\n    android:summary=\"执行手势\" /\u003e\n```\n\n\u003c/details\u003e\n\n### 额外配置 \n\n在 Application 中初始化：\n\n**指定 `BASE_SERVICE_CLS` 及 `GESTURE_SERVICE_CLS`**\n\n```kotlin\noverride fun onCreate() {\n    super.onCreate()\n    AccessibilityApi.init(this,\n        BaseAccessibilityService::class.java,\n        GestureAccessibilityService::class.java)\n}\n```\n\n\n\n### 合并服务\n\n如果你想使用一个服务来完成，可使用如下配置\n\n\n1. 创建服务\n\n```kotlin\nclass AppAccessibilityService : AccessibilityApi() {\n    //启用 页面更新 回调\n    override val enableListenAppScope: Boolean = true\n\n    //页面更新回调\n    override fun onPageUpdate(currentScope: AppScope) {\n        Log.d(\"TAG\", \"onPageUpdate: $currentScope\")\n    }\n}\n```\n\n\n2. 清单注册\n\n```xml\n\u003cservice\n    android:name=\".service.AppAccessibilityService\"\n    android:description=\"@string/ser_desc\"\n    android:label=\"Service Demo\"\n    android:permission=\"android.permission.BIND_ACCESSIBILITY_SERVICE\"\u003e\n    \u003cintent-filter\u003e\n        \u003caction android:name=\"android.accessibilityservice.AccessibilityService\" /\u003e\n    \u003c/intent-filter\u003e\n    \u003cmeta-data\n        android:name=\"android.accessibilityservice\"\n        android:resource=\"@xml/accessibility_config\" /\u003e\n\u003c/service\u003e\n```\n\n3. `res/xml/accessibility_config.xml`\n\n\n\u003cdetails\u003e\n\u003csummary\u003e点击展开 accessibility_config.xml\u003c/summary\u003e\n\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\n\u003caccessibility-service xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:accessibilityEventTypes=\"typeWindowStateChanged\"\n    android:accessibilityFeedbackType=\"feedbackAllMask\"\n    android:accessibilityFlags=\"flagIncludeNotImportantViews|flagReportViewIds|flagRetrieveInteractiveWindows|flagRequestEnhancedWebAccessibility\"\n    android:canRetrieveWindowContent=\"true\"\n    android:description=\"@string/base_ser_desc\"\n    android:notificationTimeout=\"10\"\n    android:canPerformGestures=\"true\"\n    android:canRequestEnhancedWebAccessibility=\"true\"\n    android:settingsActivity=\".MainActivity\"\n    android:summary=\"基础导航/视图检索操作\"/\u003e\n\u003c!--    android:canRequestFilterKeyEvents=\"true\"--\u003e\n\u003c!--flagRequestFilterKeyEvents--\u003e\n```\n\n\u003c/details\u003e\n\n4. Application 初始化配置 \n\n在 Application 中初始化：\n\n```kotlin\noverride fun onCreate() {\n    super.onCreate()\n    AccessibilityApi.init(this, AppAccessibilityService::class.java)\n}\n```\n\n----------------------------\n\n更多 `Api` 可在下列文件查看\n\n- [view_finder_api.kt](accessibility-api/src/main/java/cn/vove7/andro_accessibility_api/api/view_finder_api.kt)\n- [gesture_api.kt](accessibility-api/src/main/java/cn/vove7/andro_accessibility_api/api/gesture_api.kt)\n- [nav_api.kt](accessibility-api/src/main/java/cn/vove7/andro_accessibility_api/api/nav_api.kt)\n- [nav_api.kt](accessibility-api/src/main/java/cn/vove7/andro_accessibility_api/api/nav_api.kt)\n- [ViewNode](accessibility-api/src/main/java/cn/vove7/andro_accessibility_api/viewnode/ViewNode.kt)\n- [SmartFinderConditions.kt](accessibility-api/src/main/java/cn/vove7/andro_accessibility_api/viewfinder/SmartFinderConditions.kt)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FKrosxx%2FAndroid-Auto-Api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FKrosxx%2FAndroid-Auto-Api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FKrosxx%2FAndroid-Auto-Api/lists"}