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

Jetpack Compose中能否用TtsSpan调整文本发音?含号码朗读需求

在Jetpack Compose中实现屏幕阅读器逐个朗读电话号码的方案

用TtsSpan实现(推荐)

完全可以通过TtsSpan实现这个需求,Jetpack Compose的语义系统支持通过Modifier.semantics配置带TtsSpan的朗读内容,让屏幕阅读器(如TalkBack)按照电话号码的规则逐个数字朗读。

具体实现示例:

@Composable
fun PhoneNumberListItem(phoneNumber: String) {
    Text(
        text = phoneNumber,
        modifier = Modifier
            .fillMaxWidth()
            .padding(horizontal = 16.dp, vertical = 12.dp)
            .semantics {
                contentDescription = buildAnnotatedString {
                    // 添加电话号码文本
                    append(phoneNumber)
                    // 为整个电话号码添加Telephone类型的TtsSpan
                    addTtsSpan(
                        start = 0,
                        end = phoneNumber.length,
                        span = TtsSpan.TelephoneBuilder()
                            .setNumber(phoneNumber)
                            .build()
                    )
                }
            }
    )
}

这段代码通过buildAnnotatedString给电话号码绑定Telephone类型的TtsSpan,系统屏幕阅读器会识别这个标记,自动按照电话号码的朗读逻辑逐个读出数字,而非连读成字符串。

替代方案

如果不想用TtsSpan,也可以通过格式化contentDescription实现类似效果:

@Composable
fun PhoneNumberListItem(phoneNumber: String) {
    val spacedNumber = phoneNumber.toCharArray().joinToString(" ")
    Text(
        text = phoneNumber,
        modifier = Modifier
            .fillMaxWidth()
            .padding(horizontal = 16.dp, vertical = 12.dp)
            .semantics {
                contentDescription = spacedNumber
            }
    )
}

这种方式把电话号码拆成带空格的单个数字,屏幕阅读器会逐个朗读,但相比TtsSpan,它只是通过文本格式实现,没有利用系统的语义识别,适配性不如前者。

注意事项

  • 测试时需开启系统屏幕阅读器(如Android的TalkBack),点击列表项验证朗读效果;
  • 确保自定义组件未禁用语义支持(默认启用,无需额外设置)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 08:17:40