Android 在安卓系统中,暂停通话中的音乐播放器,然后在通话后再次恢复播放
我正在使用android.media.MediaPlayer对象在我的应用程序中播放音频文件。一切正常,但当播放歌曲时接到电话时,应用程序不会暂停媒体播放器,您可以在通话中听到歌曲。请告诉我如何在通话中暂停media player,并在通话结束后再次恢复。当您的活动(或服务)被通话中断时,请放置Android 在安卓系统中,暂停通话中的音乐播放器,然后在通话后再次恢复播放,android,Android,我正在使用android.media.MediaPlayer对象在我的应用程序中播放音频文件。一切正常,但当播放歌曲时接到电话时,应用程序不会暂停媒体播放器,您可以在通话中听到歌曲。请告诉我如何在通话中暂停media player,并在通话结束后再次恢复。当您的活动(或服务)被通话中断时,请放置MediaPlayer#pause()进入活动#onPause和继续播放的代码进入活动#onResume我认为问题可能在于MediaPlayer是在自己的线程中执行的,当您的活动暂停时,并不意味着Medi
MediaPlayer#pause()
进入活动#onPause
和继续播放的代码进入活动#onResume
我认为问题可能在于MediaPlayer是在自己的线程中执行的,当您的活动暂停时,并不意味着MediaPlayer也会自动暂停使用PhoneStateListener
来确定电话正在使用中。我也有类似的问题。我的HTC Desire HD会在接到电话时停止播放音乐,但挂断后不会继续播放。我发现这是由Viber应用程序引起的,当我删除“Viber”时,一切都恢复正常。现在,当我接到电话时,音乐会在我结束通话后暂停并继续播放。在您的应用程序中引入a,如下所示:
private PhoneStateListener mPhoneListener = new PhoneStateListener() {
public void onCallStateChanged(int state, String incomingNumber) {
try {
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:
pauseStream();
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
break;
case TelephonyManager.CALL_STATE_IDLE:
resumeStream();
break;
default:
}
} catch (Exception e) {
Log.e(TAG, e.getMessage());
}
}
};
然后,您需要在onCreate()中或在服务的onStartCommand()方法中设置它:
radioStream.setAudioStreamType(AudioManager.STREAM_MUSIC);
radioStream.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer stream) {
telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
telephonyManager.listen(mPhoneListener, PhoneStateListener.LISTEN_CALL_STATE);
isMusicPlaying = true;
isServiceRunning = true;
stream.start();
}
});
try {
radioStream.prepare();
} catch (IllegalStateException e1) {
e1.printStackTrace();
streamErrorHandler();
} catch (IOException e1) {
e1.printStackTrace();
streamErrorHandler();
}
您可以实现以下方法的版本:
public static void pauseStream() {
if (isServiceRunning) {
if (radioStream.isPlaying()) {
isMusicPlaying = false;
radioStream.pause();
}
} else {
Log.i(TAG, "service isn't running");
}
}
public static void resumeStream() {
if (isServiceRunning) {
if (!radioStream.isPlaying()) {
isMusicPlaying = true;
radioStream.start();
}
} else {
Log.i(TAG, "service isn't running");
}
}
radioStream是您的静态对象。我在服务中使用此选项,因此您可以退出iServiceRunning,但这对任何人都适用。以下是永久解决方案。使用audiomanager获取音频焦点。当呼叫到来时,它会呼叫AUDIOFOCUS\u LOSS\u TRANSIENT,您可以使用该方法暂停媒体播放器。调用之后,它调用AUDIOFOCUS\u增益方法,所以只需调用mediaplayer.start方法
private AudioManager.OnAudioFocusChangeListener afChangeListener = new AudioManager.OnAudioFocusChangeListener() {
@Override
public void onAudioFocusChange(int focusChange) {
if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
mMediaPlayer.start();}
else if(focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT){
mMediaPlayer.pause();
}
问题是,如果用户更改应用程序中的活动,它也会暂停音乐。我同意下面的标记-在这一点上,您可以使用PhoneStateListener来检测暂停是否是由于电话使用造成的我是否需要在AndroidManifest.xml中包含一些权限或与电话相关的标记来使用此代码?@MMazzon I设置以下安全权限:android.permission.FOREGROUND\u SERVICE、android.permission.MODIFY\u AUDIO\u SETTINGS、android.permission.READ\u PHONE\u STATE,如果您将其用于在线流,则还需要添加:android:usesCleartextTraffic=“true”随你的便