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
调用),其中 streamType
是 AudioManager.STREAM_RING
或 AudioManager.STREAM_VOICE_CALL.
)
通话结束后,我正确地放弃了通话的音频焦点
myAudioManager.abandonAudioFocus(null)
(或相应的 Build.VERSION.SDK_INT >= 26
调用)。但是,音乐没有继续播放。
我通过将请求 AudioManager.AUDIOFOCUS_GAIN
替换为 AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE
来解决问题。
正在开发 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
调用),其中 streamType
是 AudioManager.STREAM_RING
或 AudioManager.STREAM_VOICE_CALL.
)
通话结束后,我正确地放弃了通话的音频焦点
myAudioManager.abandonAudioFocus(null)
(或相应的 Build.VERSION.SDK_INT >= 26
调用)。但是,音乐没有继续播放。
我通过将请求 AudioManager.AUDIOFOCUS_GAIN
替换为 AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE
来解决问题。