java - 放弃音频焦点并继续之前的音乐/视频流
问题描述
我在我的应用程序中实现了 TTS(文本到语音)功能。一切正常,现在我遇到了一个我找不到解决方案的问题。
基本上,我在激活我的 TTS 功能之前获得了音频焦点。在实际应用程序中,当我这样做时音乐停止(这正是我希望它的行为方式)。但是,一旦 TTS 功能完成,我会放弃音频焦点,音乐/视频不会继续。我不知道如何继续在我的 TTS 之前播放的上一个音乐/视频流。
这是我实现的代码:
完成 TTS 后放弃音频焦点的代码:
@Override
public void onUtteranceCompleted(String s) {
Log.v(TAG, s);
if(!getUserPreference().getTest()){
//setDefaultVolume();
audioManager.abandonAudioFocus(this);
}
}
在我的 TTS 开始之前获取音频焦点的代码:
audioManager = (AudioManager)this.getSystemService(Context.AUDIO_SERVICE);
int requestAudioFocusResult = audioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
if(requestAudioFocusResult == AudioManager.AUDIOFOCUS_REQUEST_GRANTED){...
我欢迎任何关于我的问题的进一步问题。期待答案/建议。
根据答案更改:
int requestAudioFocusResult = audioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK);
我已经按照答案所述实现了,但是 requestAudioFocusResult 值在应该为 3 时返回为 1。知道吗?
解决方案
一旦 TTS 功能完成,我放弃音频焦点,音乐/视频不会继续。
由于您无限期地请求音频焦点(AUDIOFOCUS_GAIN
),您描述的行为听起来像预期的行为:
[我]假设现在正在使用另一个应用程序来收听音频,并且您的应用程序应该有效地自行结束。实际上,这意味着停止播放、移除媒体按钮侦听器(允许新的音频播放器专门处理这些事件)并放弃您的音频焦点。那时,您会期望在继续播放音频之前需要用户操作(在您的应用中按下播放)。
在我看来,您应该请求临时音频焦点,即AudioManager.AUDIOFOCUS_GAIN_TRANSIENT
(或AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_CAN_DUCK
取决于您是否认为其他音频可以在后台以较低音量继续播放)。
推荐阅读
- c++ - 如何在 C++ 中保存文本文件的内存?
- android - 如何在 LazyColumn Jetpack Compose 中的项目之间添加分隔符?
- go - https POST 在 golang 中没有按预期工作,但在 Python 中工作正常
- android - 查找用户点击的 ISBN 代码
- python - 两次性能测试的奇怪结果
- sql - 如何创建一个 PL SQL 过程来显示来自关系 Employee 的所有记录
- firebase - 如何更新 Firestore 数据库的安全规则?
- android-layout - 有没有办法在联系人列表中添加应用程序图标?
- algorithm - f(n) + ο(f(n)) = Θ(f(n)) 的证明
- google-chrome - chrome 通知清单 3 的解决方法