Android 如何确定其他应用程序失去音频焦点,以便我可以启动播放器

Android 如何确定其他应用程序失去音频焦点,以便我可以启动播放器,android,android-mediaplayer,android-audiomanager,Android,Android Mediaplayer,Android Audiomanager,我在网上看到很多Android播放器,一旦开始播放其他应用程序,就会失去焦点,停止播放 另一方面,一旦获得焦点的应用程序停止播放,焦点丢失的应用程序就会重新开始播放 有谁能建议我在这里缺少什么,以便在我的应用程序中实现同样的效果?我希望其他应用程序停止播放时,我的应用程序应获得关注并开始播放 private void setupAudioManager() { audioManager = (AudioManager) getSystemService(AUDIO_SERVICE

我在网上看到很多Android播放器,一旦开始播放其他应用程序,就会失去焦点,停止播放

另一方面,一旦获得焦点的应用程序停止播放,焦点丢失的应用程序就会重新开始播放

有谁能建议我在这里缺少什么,以便在我的应用程序中实现同样的效果?我希望其他应用程序停止播放时,我的应用程序应获得关注并开始播放

private void setupAudioManager() {
        audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
        audioManager.requestAudioFocus(audioFocusListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
        audioFocusListener = new OnAudioFocusChangeListener() {
            @Override
            public void onAudioFocusChange(int focusChange) {
                switch (focusChange) {
                    case AUDIOFOCUS_GAIN:
                        if (mediaPlayer == null) setupMediaPlayer();
                        else if (!mediaPlayer.isPlaying()) {
                            play();
                        }
                        mediaPlayer.setVolume(MEDIA_PLAYER_LEFT_VOLUME, MEDIA_PLAYER_RIGHT_VOLUME);
                        break;

                    case AUDIOFOCUS_LOSS:
                        if (isPlaying()) {
                            Intent intent = new Intent("HomeActivity");
                            intent.putExtra("playerState", "pause");
                            LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent);
                        }

                        break;

                    case AUDIOFOCUS_LOSS_TRANSIENT:
                        if (isPlaying()) pause();
                        break;

                    case AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
                        if (isPlaying()) mediaPlayer.setVolume(MEDIA_PLAYER_LEFT_VOLUME_LOW,
                                MEDIA_PLAYER_RIGHT_VOLUME_LOW);
                        break;

                }
            }
        };
    }
正在寻找您的建议。

以下是我的发现

如果永久失去焦点

如果音频焦点丢失是永久性的(AUDIOFOCUS_丢失),则另一个应用程序正在播放音频。你的应用程序应该立即暂停播放。此时,您的应用程序将永远不会收到AUDIOFOCUS\u增益回调。要重新启动播放,用户必须执行明确的操作,如在通知或应用程序UI中按播放传输控件

暂停应用程序后,应等待一小段时间,然后停止其媒体会话以释放资源并放弃音频焦点。延迟停止呼叫可以让用户有机会重新启动应用程序的播放。如果您的应用程序由于用户意外启动了请求音频焦点的其他应用程序而变为静默,则此功能非常有用

下面的代码片段演示了如何实现 OnAudioFocusChangeListener及其onAudioFocusChange()回调。 请注意,使用处理程序来延迟永久进程上的停止回调 失去音频焦点

处理程序使用如下所示的Runnable:

确保延迟停止不会在用户重新启动时生效 播放时,在中调用mHandler.removeCallbacks(mdelayedstopunnable) 对任何状态更改的响应。例如,在中调用removeCallbacks() 您的回调函数是onPlay()、onSkipToNext()等。您还应该调用 清理时,请在服务的onDestroy()回调中使用此方法 您的服务使用的资源


你面临什么问题?解释问题。什么特定代码不能按预期工作?例如,我的播放器正在播放音频,当我开始播放GANA应用程序时,它称为AUDIOFOCUS_LOSS并暂停我的播放器。现在,过了一段时间,我停止了GANA应用程序中的音频,我想我的播放器应该重新启动。。我是否需要运行任何广播侦听器或任何东西。检查这个@Ninja我已经处理了onCallStateChanged并且工作正常。在谷歌和stackoverflow的帮助下,我发现我需要使用MediaController,但仍然没有成功。
private Handler mHandler = new Handler();
AudioManager.OnAudioFocusChangeListener afChangeListener =
  new AudioManager.OnAudioFocusChangeListener() {
    public void onAudioFocusChange(int focusChange) {
      if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {
        // Permanent loss of audio focus
        // Pause playback immediately
        mediaController.getTransportControls().pause();
        // Wait 30 seconds before stopping playback
        mHandler.postDelayed(mDelayedStopRunnable,
          TimeUnit.SECONDS.toMillis(30));
      }
      else if (focusChange == AUDIOFOCUS_LOSS_TRANSIENT) {
        // Pause playback
      } else if (focusChange == AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) {
        // Lower the volume, keep playing
      } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
        // Your app has been granted audio focus again
        // Raise volume to normal, restart playback if necessary
      }
    }
  };
private Runnable mDelayedStopRunnable = new Runnable() {
    @Override
    public void run() {
        mediaController.getTransportControls().stop();
    }
};