Redmi设备中Android无障碍服务无法获取事件问题
问题解决:Redmi设备无障碍服务AccessibilityServiceInfo实例失效
核心问题分析
- 事件类型赋值逻辑错误:你的代码中多次直接给
info.eventTypes赋值,每次赋值都会覆盖之前的配置,最终只有最后一个事件类型TYPE_VIEW_LONG_CLICKED生效——这是通用代码问题,其他设备可能因默认配置兼容了部分事件,但本质逻辑存在错误。 - MIUI系统特殊限制:Redmi设备的MIUI对无障碍服务有更严格的实例校验,直接新建
AccessibilityServiceInfo实例可能不被系统认可,需要基于服务已有配置修改;同时MIUI的后台管控、权限验证逻辑也会影响服务正常运行。
修正方案
1. 修复事件类型赋值逻辑
使用位或运算符(or)累加事件类型,避免覆盖:
override fun onServiceConnected() { super.onServiceConnected() // 获取服务当前的配置实例,而非新建空实例 val info = serviceInfo ?: AccessibilityServiceInfo() Log.d("info_service_status", ":${info}") // 用位或组合所有需要监听的事件类型 info.eventTypes = AccessibilityEvent.CONTENTS_FILE_DESCRIPTOR or AccessibilityEvent.CONTENT_CHANGE_TYPE_STATE_DESCRIPTION or AccessibilityEvent.TYPE_GESTURE_DETECTION_START or AccessibilityEvent.TYPE_GESTURE_DETECTION_END or AccessibilityEvent.TYPE_VIEW_LONG_CLICKED // 应用修改后的配置 setServiceInfo(info) }
2. 适配MIUI系统的额外配置
(1)添加无障碍服务静态配置文件
在res/xml目录下创建accessibility_service_config.xml,明确声明需要监听的事件:
<?xml version="1.0" encoding="utf-8"?> <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" android:accessibilityEventTypes="typeGestureDetectionStart|typeGestureDetectionEnd|typeViewLongClicked|contentsFileDescriptor|contentChangeTypeStateDescription" android:accessibilityFeedbackType="feedbackGeneric" android:accessibilityFlags="flagDefault" android:canRetrieveWindowContent="true"/>
然后在AndroidManifest.xml的服务声明中引用该配置:
<service android:name=".YourAccessibilityService" android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"> <intent-filter> <action android:name="android.accessibilityservice.AccessibilityService" /> </intent-filter> <meta-data android:name="android.accessibilityservice" android:resource="@xml/accessibility_service_config" /> </service>
(2)调整MIUI系统权限与后台设置
- 进入「设置 → 应用设置 → 权限管理 → 无障碍」,确认应用的无障碍服务处于启用状态,且无额外限制;
- 进入「设置 → 应用设置 → 应用管理 → 你的应用 → 省电策略」,设置为「无限制」,避免服务被后台回收;
- 检查「设置 → 隐私保护 → 权限管理 → 读取屏幕内容」,确保应用已获取该权限。
内容的提问来源于stack exchange,提问作者Surajkaran Meghwanshi
相关产品推荐
相关产品推荐

