Android AudioManager abandonAudioFocus 没有帮助其他应用播放音乐

Android AudioManager abandonAudioFocus not helped other apps to playmusic

正在开发 Voip 通话应用程序,问题是启动本机音乐播放器并播放歌曲,打开我的应用程序进行通话后,通话音乐播放器无法通过获得焦点恢复播放。可能是什么问题,提前致谢。

注意:在这种情况下本机呼叫应用程序表现良好

AudioFocusChangeListener :

AudioManager.OnAudioFocusChangeListener mListener 
    = new AudioManager.OnAudioFocusChangeListener() {
   @Override
   public void onAudioFocusChange(int i) {
      MLog.e(TAG, "onAudioFocusChange(" + i + ")");
   }
};
 am.requestAudioFocus(mListener, AudioManager.STREAM_VOICE_CALL, AudioManager.AUDIOFOCUS_GAIN);

使用后尝试为其他应用提供焦点以恢复其他应用工作:

AudioManager am = getAudioManager();
am.abandonAudioFocus(mListener);

我不确定我是否正确地回答了你的问题,但让我解释一下。

你正在开发一个 Voip 通话应用程序,在你的情况下,当用户播放一些音乐并尝试从应用程序拨打电话时,本地播放器音乐必须暂停,并且在通话完成后它必须再次恢复回放。

您是否使用 TelephonyManager 拨打电话?然后您可以查看此 solution,您可以在其中使用 PhoneStateListener 监听呼叫状态的变化。您可以在 TelephonyManager 中注册监听器:

如果是这样,当您从 Voip 通话应用程序拨打任何电话时,只需检查 AudioManager 中的 isMusicActive。它将提供在 phone 中播放的活动音乐,包括自定义应用程序。

isMusicActive() Checks whether any music is active. from docs

 AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

if(mAudioManager.isMusicActive()) {
    Intent i = new Intent(SERVICECMD); 
    i.putExtra(CMDNAME , CMDPAUSE ); 
    sendBroadcast(i);
}

在这里,如果 MusicActive 则只需传递它并进行调用。完成通话后,再次启动/暂停音乐播放器,它将适用于所有播放器,而不仅仅是默认音乐播放器。

使用这些命令控制 android 的默认音乐播放器

public static final String CMDTOGGLEPAUSE = "togglepause";
 public static final String CMDPLAY = "play";
 public static final String CMDPAUSE = "pause";
 public static final String CMDPREVIOUS = "previous";
 public static final String CMDNEXT = "next";
 public static final String SERVICECMD = "com.android.music.musicservicecommand";
 public static final String CMDNAME = "command";
 public static final String CMDSTOP = "stop";

在您的情况下,在从您的应用拨打 voip 电话之前,请像这样检查是否存在任何活动音乐,

 private boolean isSomethingPlaying;

  AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

if(mAudioManager.isMusicActive()) {

   // some music is playing, so make it pause and save the flag for further usage.

   isSomethingPlaying = true;

    Intent i = new Intent(SERVICECMD); 
    i.putExtra(CMDNAME , CMDPAUSE ); 
    sendBroadcast(i);
}

通话完成后,然后在该函数中检查您是否通过使用带标志的广播使任何音乐暂停。

if(isSomethingPlaying)
{
  // before our call some music is playing. so make it play again.
    isSomethingPlaying = false;
   Intent i = new Intent(SERVICECMD); 
        i.putExtra(CMDNAME , CMDPLAY); 
        sendBroadcast(i);
}

我遇到了同样的问题。我正在用 VLC 播放音乐,VoIP 通话开始了。我的应用通过调用请求音频焦点:

myAudioManager.requestAudioFocus(null, streamType,
    AudioManager.AUDIOFOCUS_GAIN)

(或相应的 Build.VERSION.SDK_INT >= 26 调用),其中 streamTypeAudioManager.STREAM_RINGAudioManager.STREAM_VOICE_CALL.)

通话结束后,我正确地放弃了通话的音频焦点

myAudioManager.abandonAudioFocus(null)

(或相应的 Build.VERSION.SDK_INT >= 26 调用)。但是,音乐没有继续播放。

我通过将请求 AudioManager.AUDIOFOCUS_GAIN 替换为 AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE 来解决问题。