android实现背景音乐播放功能
参考了一下网上别人写的,再使用的时候是放在新开的线程中来播放音乐的,后来发现每次进入Activity后就会重复开始一个音乐播放的声音。为了避免重复开启播放功能我在原来代码的基础上增加了单例模式。这样就避免了出现重复播放。
packagecom.liu.zhen.utils;
importandroid.content.Context;
importandroid.content.res.AssetFileDescriptor;
importandroid.media.MediaPlayer;
importandroid.util.Log;
/**
*
*Thisclassisusedforcontrollingbackgroundmusic
*
*/
publicclassBackgroundMusic{
privatestaticBackgroundMusicbackgroundMusic=null;
privatestaticfinalStringTAG="Bg_Music";
privatefloatmLeftVolume;
privatefloatmRightVolume;
privateContextmContext;
privateMediaPlayermBackgroundMediaPlayer;
privatebooleanmIsPaused;
privateStringmCurrentPath;
privateBackgroundMusic(Contextcontext){
this.mContext=context;
initData();
}
publicstaticBackgroundMusicgetInstance(Contextcontext){
if(backgroundMusic==null){
backgroundMusic=newBackgroundMusic(context);
}
returnbackgroundMusic;
}
//初始化一些数据
privatevoidinitData(){
mLeftVolume=0.5f;
mRightVolume=0.5f;
mBackgroundMediaPlayer=null;
mIsPaused=false;
mCurrentPath=null;
}
/**
*根据path路径播放背景音乐
*
*@parampath
*:assets中的音频路径
*@paramisLoop
*:是否循环播放
*/
publicvoidplayBackgroundMusic(Stringpath,booleanisLoop){
if(mCurrentPath==null){
//这是第一次播放背景音乐---itisthefirsttimetoplaybackgroundmusic
//或者是执行end()方法后,重新被叫---orend()wascalled
mBackgroundMediaPlayer=createMediaplayerFromAssets(path);
mCurrentPath=path;
}else{
if(!mCurrentPath.equals(path)){
//播放一个新的背景音乐---playnewbackgroundmusic
//释放旧的资源并生成一个新的----releaseoldresourceandcreateanewone
if(mBackgroundMediaPlayer!=null){
mBackgroundMediaPlayer.release();
}
mBackgroundMediaPlayer=createMediaplayerFromAssets(path);
//记录这个路径---recordthepath
mCurrentPath=path;
}
}
if(mBackgroundMediaPlayer==null){
Log.e(TAG,"playBackgroundMusic:backgroundmediaplayerisnull");
}else{
//若果音乐正在播放或已近中断,停止它---ifthemusicisplayingorpaused,stopit
mBackgroundMediaPlayer.stop();
mBackgroundMediaPlayer.setLooping(isLoop);
try{
mBackgroundMediaPlayer.prepare();
mBackgroundMediaPlayer.seekTo(0);
mBackgroundMediaPlayer.start();
this.mIsPaused=false;
}catch(Exceptione){
Log.e(TAG,"playBackgroundMusic:errorstate");
}
}
}
/**
*停止播放背景音乐
*/
publicvoidstopBackgroundMusic(){
if(mBackgroundMediaPlayer!=null){
mBackgroundMediaPlayer.stop();
//shouldsetthestate,ifnot,thefollowingsequencewillbe
//error
//play->pause->stop->resume
this.mIsPaused=false;
}
}
/**
*暂停播放背景音乐
*/
publicvoidpauseBackgroundMusic(){
if(mBackgroundMediaPlayer!=null
&&mBackgroundMediaPlayer.isPlaying()){
mBackgroundMediaPlayer.pause();
this.mIsPaused=true;
}
}
/**
*继续播放背景音乐
*/
publicvoidresumeBackgroundMusic(){
if(mBackgroundMediaPlayer!=null&&this.mIsPaused){
mBackgroundMediaPlayer.start();
this.mIsPaused=false;
}
}
/**
*重新播放背景音乐
*/
publicvoidrewindBackgroundMusic(){
if(mBackgroundMediaPlayer!=null){
mBackgroundMediaPlayer.stop();
try{
mBackgroundMediaPlayer.prepare();
mBackgroundMediaPlayer.seekTo(0);
mBackgroundMediaPlayer.start();
this.mIsPaused=false;
}catch(Exceptione){
Log.e(TAG,"rewindBackgroundMusic:errorstate");
}
}
}
/**
*判断背景音乐是否正在播放
*
*@return:返回的boolean值代表是否正在播放
*/
publicbooleanisBackgroundMusicPlaying(){
booleanret=false;
if(mBackgroundMediaPlayer==null){
ret=false;
}else{
ret=mBackgroundMediaPlayer.isPlaying();
}
returnret;
}
/**
*结束背景音乐,并释放资源
*/
publicvoidend(){
if(mBackgroundMediaPlayer!=null){
mBackgroundMediaPlayer.release();
}
//重新“初始化数据”
initData();
}
/**
*得到背景音乐的“音量”
*
*@return
*/
publicfloatgetBackgroundVolume(){
if(this.mBackgroundMediaPlayer!=null){
return(this.mLeftVolume+this.mRightVolume)/2;
}else{
return0.0f;
}
}
/**
*设置背景音乐的音量
*
*@paramvolume
*:设置播放的音量,float类型
*/
publicvoidsetBackgroundVolume(floatvolume){
this.mLeftVolume=this.mRightVolume=volume;
if(this.mBackgroundMediaPlayer!=null){
this.mBackgroundMediaPlayer.setVolume(this.mLeftVolume,
this.mRightVolume);
}
}
/**
*createmediaplayerformusic
*
*@parampath
*thepathrelativetoassets
*@return
*/
privateMediaPlayercreateMediaplayerFromAssets(Stringpath){
MediaPlayermediaPlayer=null;
try{
AssetFileDescriptorassetFileDescritor=mContext.getAssets()
.openFd(path);
mediaPlayer=newMediaPlayer();
mediaPlayer.setDataSource(assetFileDescritor.getFileDescriptor(),
assetFileDescritor.getStartOffset(),
assetFileDescritor.getLength());
mediaPlayer.prepare();
mediaPlayer.setVolume(mLeftVolume,mRightVolume);
}catch(Exceptione){
mediaPlayer=null;
Log.e(TAG,"error:"+e.getMessage(),e);
}
returnmediaPlayer;
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。