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

Android TV/STB通过语音识别Intent保存音频无法获取URI如何解决

问题原因

  • 你用到的android.speech.extra.GET_AUDIO、android.speech.extra.GET_AUDIO_FORMAT两个参数不属于Android官方公开的RecognizerIntent标准参数,是手机端Google快速搜索应用的私有扩展能力,没有纳入Android TV端的GMS组件适配范围。
  • 即便你的TV/机顶盒和手机都升级到了同版本的谷歌语音相关应用,TV端的语音识别服务默认裁剪了返回原始录音URI的功能,没有对这两个私有参数做响应,所以不会返回音频地址。
  • 部分第三方机顶盒使用的是自研的语音识别服务,本身就不支持谷歌的私有扩展参数,自然也拿不到音频URI。

可行解决方案

不要依赖这个非公开的扩展能力,改用自行录音+同步调用语音识别的方案,全Android平台通用:

  1. 提前申请RECORD_AUDIO录音权限,Android TV端的动态权限申请逻辑和手机保持一致即可。
  2. 不需要拉起ACTION_RECOGNIZE_SPEECH对应的三方识别Activity,改用SpeechRecognizer类在应用内直接调用语音识别能力,同时启动MediaRecorder/AudioRecord录制音频,直接存储为AMR格式到本地。
  3. 收到识别结果回调后停止录音,即可直接拿到完整的音频文件,不需要依赖系统识别服务返回URI。

现有代码优化建议

你当前的代码中Uri audioUri = data.getData();后没有做非空判断,直接传给openInputStream会触发空指针崩溃,建议添加非空判断逻辑:

Uri audioUri = data.getData();
if (audioUri == null) {
    // 处理拿不到音频的场景,比如提示用户当前设备不支持该特性,或者走自行录音的逻辑
    Toast.makeText(this, "当前设备不支持获取识别音频", Toast.LENGTH_SHORT).show();
    return;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 12:06:02