如何确定Google地图何时在Android中使用

时间:2019-02-07 18:18:11

标签: android google-maps

当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());

4 个答案:

答案 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

用于表示暂时的增益或音频焦点请求,预计持续很短的时间。临时更改的示例是行驶方向回放或事件通知。