轉載自:http://blog.csdn.net/chenchuntong/article/details/8813719
平時開發的時候 遇到這樣的一個問題: 我開着系統的音樂播放器,我在我的應用程序裏面播一段音樂 兩個音樂會同時播放通過在stackoverflow查資料後才發行我們得自己音樂需要獲取焦點,在我們音樂播完了以後釋放掉焦點。這樣系統的歌曲會繼續播放下面介紹一下步驟
1.獲取AudioManager對象
AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
2. 註冊OnAudioFocusChangeListener監聽
OnAudioFocusChangeListener afChangeListener = new OnAudioFocusChangeListener() {
public void onAudioFocusChange(int focusChange) {
if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT) {
if(mediaPlayer.isPlaying()){
mediaPlayer.pause();
}
} else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
if(mediaPlayer==null){
initBeepSound();
}else if(!mediaPlayer.isPlaying()){
mediaPlayer.start();
}
// Resume playback
} else if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {
if(mediaPlayer.isPlaying()){
mediaPlayer.stop();
}
am.abandonAudioFocus(afChangeListener);
// Stop playback
}else if(focusChange==AudioManager.AUDIOFOCUS_REQUEST_GRANTED){
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
}
}else if(focusChange==AudioManager.AUDIOFOCUS_REQUEST_FAILED){
if(mediaPlayer.isPlaying()){
mediaPlayer.stop();
}
}
}
};
3.就是在我們播放音樂的時候爲AudioManager添加獲取焦點的監聽
int result = am.requestAudioFocus(afChangeListener,
// Use the music stream.
AudioManager.STREAM_MUSIC, // Request permanent focus.
AudioManager.AUDIOFOCUS_GAIN);
if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
mediaPlayer.start();
// Start playback. // 開始播放音樂文件
}
4.在我們不用的時候將焦點釋放掉一般我們是在ondestroy()方法中釋放
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
am.abandonAudioFocus(afChangeListener);
}
下面介紹一下AudioManager的幾個常量
AUDIOFOCUS_REQUEST_GRANTED 永久獲取媒體焦點(播放音樂)
AUDIOFOCUS_GAIN_TRANSIENT 暫時獲取焦點 適用於短暫的音頻
AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK Duck我們應用跟其他應用共用焦點 我們播放的時候其他音頻會降低音量
下面奉上代碼
-
package com.example.mediatest;
-
-
import java.io.IOException;
-
-
import android.app.Activity;
-
import android.content.BroadcastReceiver;
-
import android.content.ComponentName;
-
import android.content.Context;
-
import android.content.Intent;
-
import android.content.res.AssetFileDescriptor;
-
import android.media.AudioManager;
-
import android.media.AudioManager.OnAudioFocusChangeListener;
-
import android.media.MediaPlayer;
-
import android.media.MediaPlayer.OnCompletionListener;
-
import android.os.Bundle;
-
import android.view.KeyEvent;
-
import android.view.Menu;
-
import android.view.View;
-
import android.view.View.OnClickListener;
-
import android.widget.Button;
-
import android.widget.Toast;
-
-
public class MainActivity extends Activity {
-
-
private Button play;
-
private Button stop;
-
private AudioManager am;
-
@Override
-
protected void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.activity_main);
-
play = (Button) findViewById(R.id.button1);
-
stop = (Button) findViewById(R.id.button2);
-
am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
-
initBeepSound();
-
mode = am.getMode();
-
if (mode == AudioManager.MODE_NORMAL) {
-
Toast.makeText(this, "MODE_NORMAL", Toast.LENGTH_LONG).show();
-
} else if (mode == AudioManager.MODE_IN_CALL) {
-
Toast.makeText(this, "MODE_IN_CALL", Toast.LENGTH_LONG).show();
-
-
} else if (mode == AudioManager.MODE_RINGTONE) {
-
Toast.makeText(this, "MODE_RINGTONE", Toast.LENGTH_LONG).show();
-
-
}
-
remoteControlReceiver = new ComponentName(" com.example.mediatest",
-
" com.example.mediatest.RemoteControlReceiver");
-
play.setOnClickListener(new OnClickListener() {
-
-
@Override
-
public void onClick(View v) {
-
if (mediaPlayer != null) {
-
mediaPlayer.start();
-
-
} else {
-
initBeepSound();
-
mediaPlayer.start();
-
}
-
-
int result = am.requestAudioFocus(afChangeListener,
-
-
AudioManager.STREAM_MUSIC,
-
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK);
-
if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
-
mediaPlayer.start();
-
-
}
-
}
-
-
});
-
stop.setOnClickListener(new OnClickListener() {
-
-
@Override
-
public void onClick(View v) {
-
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
-
mediaPlayer.stop();
-
mediaPlayer.release();
-
mediaPlayer = null;
-
}
-
am.abandonAudioFocus(afChangeListener);
-
}
-
});
-
}
-
-
OnAudioFocusChangeListener afChangeListener = new OnAudioFocusChangeListener() {
-
public void onAudioFocusChange(int focusChange) {
-
if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT) {
-
if (mediaPlayer.isPlaying()) {
-
mediaPlayer.pause();
-
}
-
-
} else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
-
if (mediaPlayer == null) {
-
initBeepSound();
-
} else if (!mediaPlayer.isPlaying()) {
-
-
mediaPlayer.start();
-
-
}
-
-
} else if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {
-
if (mediaPlayer.isPlaying()) {
-
-
mediaPlayer.stop();
-
}
-
am.abandonAudioFocus(afChangeListener);
-
-
} else if (focusChange == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
-
if (mediaPlayer.isPlaying()) {
-
mediaPlayer.stop();
-
}
-
-
} else if (focusChange == AudioManager.AUDIOFOCUS_REQUEST_FAILED) {
-
if (mediaPlayer.isPlaying()) {
-
mediaPlayer.stop();
-
}
-
-
}
-
}
-
};
-
-
-
-
private final OnCompletionListener beepListener = new OnCompletionListener() {
-
public void onCompletion(MediaPlayer mediaPlayer) {
-
mediaPlayer.seekTo(0);
-
}
-
};
-
private MediaPlayer mediaPlayer;
-
private ComponentName remoteControlReceiver;
-
private int mode;
-
-
private void initBeepSound() {
-
if (mediaPlayer == null) {
-
-
-
-
setVolumeControlStream(AudioManager.STREAM_MUSIC);
-
mediaPlayer = new MediaPlayer();
-
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
-
mediaPlayer.setOnCompletionListener(beepListener);
-
-
AssetFileDescriptor file = getResources().openRawResourceFd(
-
R.raw.demo);
-
try {
-
mediaPlayer.setDataSource(file.getFileDescriptor(),
-
file.getStartOffset(), file.getLength());
-
file.close();
-
mediaPlayer.prepare();
-
} catch (IOException e) {
-
mediaPlayer = null;
-
}
-
}
-
}
-
-
@Override
-
protected void onStop() {
-
-
super.onStop();
-
am.abandonAudioFocus(afChangeListener);
-
-
}
-
-
@Override
-
public boolean onCreateOptionsMenu(Menu menu) {
-
-
getMenuInflater().inflate(R.menu.main, menu);
-
return true;
-
}
-
-
}