需求:播放其它应用中的音频文件(QQ音乐), 然后播放本应用中的音频文件要求降低之前播放的(QQ音乐)音频的音量
不多解释直接贴代码
public class Main2Activity extends Activity {
private static final String TAG = "Main2Activity";
private AudioPlayer mMusicPlayer;
private AudioAttributes mMusicAudioAttrib;
MediaPlayer mMediaPlayer;
private AudioManager mAudioManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.audio);
mAudioManager = (AudioManager) getSystemService(
Context.AUDIO_SERVICE);
//设置音频的属性
//Content描述的是:这个音频的内容是什么,是语音/音乐
//Usage用来描述为什么要播放这个音频,是用来导航/闹钟/播放媒体
mMusicAudioAttrib = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build();
//第一个参数将需要播放音频文件。第二个参数是音频的属性
mMusicPlayer = new AudioPlayer( R.raw.xixixi, mMusicAudioAttrib);
findViewById(R.id.button_media_play_start).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
boolean repeat = true;
mMusicPlayer.start(repeat, AudioManager.AUDIOFOCUS_GAIN);
}
});
findViewById(R.id.button_media_play_stop).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mMusicPlayer.stop();
}
});
}
private final AudioManager.OnAudioFocusChangeListener mRadioFocusListener = new AudioManager.OnAudioFocusChangeListener() {
@Override
public void onAudioFocusChange(int focusChange) {
if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT) {
// Pause playback because your Audio Focus was
// temporarily stolen, but will be back soon.
// i.e. for a phone call
} else if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {
// Stop playback, because you lost the Audio Focus.
// i.e. the user started some other playback app
// Remember to unregister your controls/buttons here.
// And release the kra — Audio Focus!
// You’re done.
// am.abandonAudioFocus(afChangeListener);
} else if (focusChange ==
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) {
// Lower the volume, because something else is also
// playing audio over you.
// i.e. for notifications or navigation directions
// Depending on your audio playback, you may prefer to
// pause playback here instead. You do you.
//mMediaPlayer.setVolume(0.3f, 0.3f);
} else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
// Resume playback, because you hold the Audio Focus
// again!
// i.e. the phone call ended or the nav directions
// are finished
// If you implement ducking and lower the volume, be
// sure to return it to normal here, as well.
//mMediaPlayer.setVolume(1f, 1f);
}
}
};
private class AudioPlayer {
private final Uri mUri;
Context mContext;
public AudioPlayer(int thz, AudioAttributes mMusicAudioAttrib) {
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setAudioAttributes(mMusicAudioAttrib);
mUri = Uri.parse("android.resource://com.example.myapplication/" + thz);
}
public void start(boolean repeat, int audiofocusGain) {
//获取音频焦点
//*AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK:获取焦点,告知被剥夺者,你可以继续播放并将音量降为0或者低音量播放
AudioFocusRequest request = new AudioFocusRequest.Builder(audiofocusGain)
.setOnAudioFocusChangeListener(mRadioFocusListener)
.setFocusGain(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK)
.build();
mAudioManager.requestAudioFocus(request);
try {
mMediaPlayer.reset();
mMediaPlayer.setDataSource(Main2Activity.this, mUri);
mMediaPlayer.prepare();
} catch (IOException e) {
e.printStackTrace();
}
mMediaPlayer.setLooping(repeat);
mMediaPlayer.start();
}
public void stop() {
Log.d(TAG, "stop: ");
mMediaPlayer.stop();
mAudioManager.abandonAudioFocus(mRadioFocusListener);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
mAudioManager.abandonAudioFocus(mRadioFocusListener);
}
}
亲测有效