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

如何判断Android Talkback已完成内容播报

Android 监听无障碍播报完成 & 解决 Talkback 播报截断/意外菜单提示问题

对应 iOS announcementDidFinishNotification 的功能

Android 没有完全对等的系统通知,但可通过 AccessibilityService 监听播报相关无障碍事件,或结合 View.announceForAccessibility() + 自定义回调实现类似效果。

解决你的场景问题

针对「元素获焦后,Talkback 播报未完成就被 Toast 截断」以及「Toast 获焦导致意外菜单播报」的问题,推荐以下方案:

1. 替换 Toast 为 announceForAccessibility

直接使用 Toast 易引发焦点冲突和额外播报,建议跳过 Toast,调用任意可见 View 的 announceForAccessibility() 触发 Talkback 播报,该方法不会抢占焦点,也不会触发菜单提示:

yourTargetView.setOnFocusChangeListener { _, hasFocus ->
    if (hasFocus) {
        // 需等待焦点元素播报完成后再执行,见下文监听方案
        yourTargetView.announceForAccessibility("自定义播报内容")
    }
}

2. 监听 Talkback 播报完成(精准方案)

通过自定义 AccessibilityService 监听播报完成事件,确保焦点元素播报结束后再触发自定义内容:

  • 自定义 AccessibilityService:
class TalkbackMonitorService : AccessibilityService() {
    private var finishCallback: (() -> Unit)? = null

    override fun onAccessibilityEvent(event: AccessibilityEvent) {
        if (event.eventType == AccessibilityEvent.TYPE_ANNOUNCEMENT) {
            val announcedContent = event.text.joinToString()
            // 可根据焦点元素的播报内容过滤,避免误触发
            if (announcedContent == "焦点元素的播报文本") {
                finishCallback?.invoke()
                finishCallback = null
            }
        }
    }

    override fun onInterrupt() {}

    fun setFinishCallback(callback: () -> Unit) {
        finishCallback = callback
    }

    // 实现 LocalBinder 供外部绑定
    inner class LocalBinder : Binder() {
        fun getService(): TalkbackMonitorService = this@TalkbackMonitorService
    }

    override fun onBind(intent: Intent): IBinder = LocalBinder()
}
  • 清单文件声明 Service:
<service
    android:name=".TalkbackMonitorService"
    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_config" />
</service>
  • 创建 res/xml/accessibility_config.xml:
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeAnnouncement"
    android:accessibilityFeedbackType="feedbackSpoken"
    android:accessibilityFlags="flagDefault"
    android:description="@string/talkback_monitor_desc" />
  • 在 Activity 中绑定并使用:
private lateinit var monitorService: TalkbackMonitorService
private val serviceConn = object : ServiceConnection {
    override fun onServiceConnected(className: ComponentName, service: IBinder) {
        monitorService = (service as TalkbackMonitorService.LocalBinder).getService()
        yourTargetView.setOnFocusChangeListener { _, hasFocus ->
            if (hasFocus) {
                monitorService.setFinishCallback {
                    yourTargetView.announceForAccessibility("自定义播报内容")
                }
            }
        }
    }

    override fun onServiceDisconnected(arg0: ComponentName) {}
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    bindService(Intent(this, TalkbackMonitorService::class.java), serviceConn, Context.BIND_AUTO_CREATE)
}

override fun onDestroy() {
    super.onDestroy()
    unbindService(serviceConn)
}

3. 简易延迟方案(无 AccessibilityService 时)

若无法接入 AccessibilityService,可根据焦点元素播报内容长度设置延迟(精准度略低):

yourTargetView.setOnFocusChangeListener { _, hasFocus ->
    if (hasFocus) {
        Handler(Looper.getMainLooper()).postDelayed({
            yourTargetView.announceForAccessibility("自定义播报内容")
        }, 1500) // 示例延迟1.5秒,可按需调整
    }
}

解决意外菜单播报问题

之前设置 Toast 获焦导致的额外播报,是因为 Talkback 会自动播报可交互元素的操作选项。解决方式:

  • 方案一:完全放弃 Toast,改用 announceForAccessibility() 播报(推荐)
  • 方案二:若必须显示 Toast,设置其 View 为无障碍不可交互:
val toast = Toast.makeText(this, "Toast内容", Toast.LENGTH_SHORT)
toast.view?.importantForAccessibility = View.IMPORTANT_FOR_ACCESSIBILITY_NO
toast.show()
// 单独触发播报
yourTargetView.announceForAccessibility("Toast内容")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 22:04:57