当Google地图宣布转弯方向时,我正在尝试修改应用程序以暂停音频播放。
我已将以下代码(如下所示)添加到我的应用程序中。当Pandora Radio或Spotify之类的应用程序请求音频焦点以播放音乐时,将调用音频焦点侦听器,但当Google地图宣布转弯方向时,不会调用音频焦点侦听器。为了检测这种行为,我还有其他意图要听吗?
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
audioManager.requestAudioFocus(new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
.setAudioAttributes(
new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build()
)
.setAcceptsDelayedFocusGain(true)
.setOnAudioFocusChangeListener(new AudioManager.OnAudioFocusChangeListener() {
@Override
public void onAudioFocusChange(int focusChange) {
// This is called by Pandora Radio and Spotify
Log.d("Focus change:", " Event is: " + focusChange);
}
}).build());
答案 0 :(得分:1)
您将需要AudioManager
的{{1}}更新。
这仅适用于Android O及更高版本。
为此,您必须访问音频管理器-
AudioPlaybackCallback
然后添加这样的侦听器-
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
在回调中返回的Handler handler = new Handler();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
audioManager.registerAudioPlaybackCallback(new AudioManager.AudioPlaybackCallback() {
@Override
public void onPlaybackConfigChanged(List<AudioPlaybackConfiguration> configs) {
super.onPlaybackConfigChanged(configs);
// This will be called when navigation audio state on google maps changes
Log.d("audio active", String.valueOf(audioManager.isMusicActive()));
}
}, handler);
}
有一个List<AudioPlaybackConfiguration> configs
对象,该对象包含描述音频播放的字符串。对于Google地图导航,字符串常量值为AudioAttribute
,您可以将其比较以确保它是宣布导航方向的Google Maps。
通过编程,您可以像这样
USAGE_ASSISTANCE_NAVIGATION_GUIDANCE
答案 1 :(得分:0)
对于Android O,仅在我将播放器的AudioAttributes和内容类型显式设置为语音(因为我正在播放Podcast mp3文件,未对其他内容类型进行测试)之后,才收到缺少的导航鸭子焦点更改通知:>
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
AudioAttributes.Builder aab = new AudioAttributes.Builder();
aab.setContentType(AudioAttributes.CONTENT_TYPE_SPEECH);
aab.setUsage(USAGE_MEDIA);
player.setAudioAttributes(aab.build());
答案 2 :(得分:-1)
@Override
public void onAudioFocusChange(int focusChange) {
switch (focusChange) {
case AudioManager.AUDIOFOCUS_GAIN:
if (mPlayOnAudioFocus && !isPlaying()) {
play();
} else if (isPlaying()) {
setVolume(MEDIA_VOLUME_DEFAULT);
}
mPlayOnAudioFocus = false;
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
setVolume(MEDIA_VOLUME_DUCK);
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
if (isPlaying()) {
mPlayOnAudioFocus = true;
pause();
}
break;
case AudioManager.AUDIOFOCUS_LOSS:
mAudioManager.abandonAudioFocus(this);
mPlayOnAudioFocus = false;
stop();
break;
}
}
}
以下代码段包含用于播放音频的应用程序的此接口的实现。它可以处理瞬态音频焦点丢失的回避。它还可以处理由于用户暂停播放而引起的音频焦点变化,而其他应用程序(例如Google Assistant)会导致音频焦点暂时丢失
因为您的应用需要播放音频通知或按语音提示的方向转弯,还是需要在短时间内录制用户的音频,所以它是否暂时需要音频焦点(可以选择降低) ?这是
AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK。
在瞬态音频焦点丢失方面令人难以置信 您可以选择暂停播放或暂时减小OnAudioFocusChangeListener中音频播放的音量,具体取决于应用程序需要交付的UX。 Android O支持自动回避,其中系统将自动减少应用程序的体积,而无需编写任何其他代码。在您的OnAudioFocusChangeListener中,只需忽略AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK事件。
在Android N和更早的版本中,您必须自己实现闪避(如上面的代码片段所示)。
有关详细信息,请访问:https://medium.com/androiddevelopers/audio-focus-3-cdc09da9c122
AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK 在API级别8中添加 公共静态最终int AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK 用于指示音频焦点的临时请求,预计将持续很短的时间,并且在其他音频应用程序降低其输出级别后也可以继续播放(也称为“引诱”)。临时更改的示例包括可以在后台播放音乐的行车路线。
答案 3 :(得分:-2)
根据documentation,您应使用“ AudioManager.AUDIOFOCUS_GAIN_TRANSIENT”:
AUDIOFOCUS_GAIN_TRANSIENT
用于表示暂时的增益或音频焦点请求,预计持续很短的时间。临时更改的示例是行驶方向回放或事件通知。