private AssetManager assetManager;
private AssetFileDescriptor fileDescriptor;
private MediaPlayer mediaPlayer;
audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
assetManager = getAssets();
private void playRing(){
try {
if(mediaPlayer == null){
mediaPlayer = new MediaPlayer();
}
mediaPlayer.reset();//这个特别重要,不然回报非法状态异常错误
mediaPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);
fileDescriptor = assetManager.openFd("ring.mp3");
mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor());
fileDescriptor.close();//记得关闭流文件
mediaPlayer.setOnPreparedListener(this);
mediaPlayer.setOnCompletionListener(this);
mediaPlayer.prepareAsync();
} catch (IOException e) {
e.printStackTrace();
}
}
private void stopRing(){
if(mediaPlayer!=null){
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer = null;
}
}
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
int focusChange = audioManager.requestAudioFocus(mAudioFocusChange, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);//做音频焦点的控制
if(AudioManager.AUDIOFOCUS_GAIN==focusChange){
mediaPlayer.start();//获得焦点才播放
}
}
private AudioManager.OnAudioFocusChangeListener mAudioFocusChange = new AudioManager.OnAudioFocusChangeListener() {
@Override
public void onAudioFocusChange(int focusChange) {
switch (focusChange){
case AudioManager.AUDIOFOCUS_LOSS:
//长时间丢失焦点,当其他应用申请的焦点为AUDIOFOCUS_GAIN时,
//会触发此回调事件,例如播放QQ音乐,网易云音乐等
//通常需要暂停音乐播放,若没有暂停播放就会出现和其他音乐同时输出声音
Log.e(TAG, "AUDIOFOCUS_LOSS");
stopRing();
//释放焦点,该方法可根据需要来决定是否调用
//若焦点释放掉之后,将不会再自动获得
audioManager.abandonAudioFocus(mAudioFocusChange);
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
//短暂性丢失焦点,当其他应用申请AUDIOFOCUS_GAIN_TRANSIENT或AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE时,
//会触发此回调事件,例如播放短视频,拨打电话等。
//通常需要暂停音乐播放
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
//短暂性丢失焦点并作降音处理
break;
case AudioManager.AUDIOFOCUS_GAIN:
//当其他应用申请焦点之后又释放焦点会触发此回调
//可重新播放音乐
Log.e(TAG, "AUDIOFOCUS_GAIN");
break;
}
}
};