You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何我的Android应用无法读取Accessibility事件?

问题:Android无障碍服务未触发,无法获取其他应用屏幕内容日志

我正在开发一款读取其他应用屏幕内容的Android应用,尝试了所有可行方法,但始终无法获取屏幕内容的日志。我已经在系统设置中开启了无障碍功能,但MyAccessibilityService类从未被调用,Logcat里完全看不到相关输出。


MainActivity 代码

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val btn = findViewById<Button>(R.id.btn)
        val txt = findViewById<TextView>(R.id.textView)
        btn.setOnClickListener {
            startActivity(Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS))
        }
    }
}

MyAccessibilityService 代码

class MyAccessibilityService : AccessibilityService() {
    override fun onAccessibilityEvent(event: AccessibilityEvent?) {
        // 此处可通过AccessibilityNodeInfo读取当前窗口的屏幕内容
        val nodeInfo = event?.source
        val text = nodeInfo?.text?.toString()
        Log.d("MyAccessibilityService", "onAccessibilityEvent: $text")
    }

    override fun onInterrupt() {
        // 无障碍服务被中断时调用此方法
    }
}

AndroidManifest.xml 代码

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.MyApplication"
        tools:targetApi="31">
        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:label="@string/app_name"
            android:theme="@style/Theme.MyApplication">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service
            android:name=".MyAccessibilityService"
            android:label="@string/accessibility_service_label"
            android:description="@string/accessibility_service_description"
            android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
            android:exported="true">
            <intent-filter>
                <action android:name="android.accessibilityservice.AccessibilityService"/>
            </intent-filter>
            <meta-data
                android:name="android.accessibilityservice"
                android:resource="@xml/accessibility_service_config"/>
        </service>

    </application>

</manifest>

无障碍服务配置文件 (res/xml/accessibility_service_config.xml)

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeWindowContentChanged"
    android:accessibilityFeedbackType="feedbackSpoken"
    android:accessibilityFlags="flagDefault"
    android:canRetrieveWindowContent="true"
    android:description="@string/accessibility_service_description"
    android:notificationTimeout="100"
    android:packageNames="com.example.app1,com.example.app2"
    android:settingsActivity=".MainActivity"/>

排查与修复建议

  1. 确认目标应用包名准确性
    配置文件中android:packageNames指定的包名必须是你要监控的真实应用包名,包名错误会导致服务监听无效应用。可通过adb shell dumpsys window | grep mCurrentFocus获取当前前台应用的包名。

  2. 扩展监听事件类型
    当前仅监听typeWindowContentChanged,触发条件较严格。建议添加更多事件类型覆盖更多场景:

    android:accessibilityEventTypes="typeWindowStateChanged|typeWindowContentChanged|typeViewClicked|typeViewScrolled"
    
  3. 验证服务是否成功绑定
    在MyAccessibilityService中重写onServiceConnected()方法,确认服务是否被系统启动:

    override fun onServiceConnected() {
        super.onServiceConnected()
        Log.d("MyAccessibilityService", "服务已成功绑定")
    }
    

    如果此日志无输出,说明服务未被系统初始化,需检查配置和权限。

  4. 优化服务配置与权限

    • 移除服务的android:exported="true",无障碍服务无需导出,系统会通过内部机制调用,导出可能引发安全风险或启动异常。
    • 确保android:description引用的字符串资源内容清晰完整,部分系统会因描述不符合要求拒绝启用服务。
  5. 手动触发事件测试
    开启无障碍服务后,切换到目标应用,进行点击、滚动、页面切换等操作,触发对应事件类型后再查看Logcat。

  6. 检查Logcat过滤规则
    无障碍服务可能运行在独立进程,不要仅过滤当前应用进程的日志,可直接搜索MyAccessibilityService标签查看输出。

内容的提问来源于stack exchange,提问作者Aswin Pratapsingh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 11:57:02