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平台通用:
- 提前申请
RECORD_AUDIO录音权限,Android TV端的动态权限申请逻辑和手机保持一致即可。 - 不需要拉起
ACTION_RECOGNIZE_SPEECH对应的三方识别Activity,改用SpeechRecognizer类在应用内直接调用语音识别能力,同时启动MediaRecorder/AudioRecord录制音频,直接存储为AMR格式到本地。 - 收到识别结果回调后停止录音,即可直接拿到完整的音频文件,不需要依赖系统识别服务返回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
相关产品推荐
相关产品推荐

