背景音乐功能

时间:2022-07-28 04:59:04
  2 import android.content.Context;
  3 import android.content.res.AssetFileDescriptor;
  4 import android.media.MediaPlayer;
  5 import android.util.Log;
  6 
  7 /**
  8  * 
  9  * This class is used for controlling background music
 10  *
 11  */
 12 public class BackgroundMusic {
 13     
 14     private static final String TAG = "Bg_Music";
 15     private float mLeftVolume;
 16     private float mRightVolume;
 17     private Context mContext;
 18     private MediaPlayer mBackgroundMediaPlayer;
 19     private boolean mIsPaused;
 20     private String mCurrentPath;
 21 
 22     public BackgroundMusic(Context context){
 23         this.mContext = context;
 24         initData();
 25     }
 26     //初始化一些数据
 27     private void initData(){
 28             mLeftVolume =0.5f;
 29             mRightVolume = 0.5f;
 30             mBackgroundMediaPlayer = null;
 31             mIsPaused = false;
 32             mCurrentPath = null;
 33     }
 34     
 35     /**
 36      * 根据path路径播放背景音乐
 37      * @param path :assets中的音频路径
 38      * @param isLoop  :是否循环播放
 39      */
 40     public void playBackgroundMusic(String path, boolean isLoop){
 41         if (mCurrentPath == null){
 42             //这是第一次播放背景音乐--- it is the first time to play background music
 43             //或者是执行end()方法后,重新被叫---or end() was called
 44             mBackgroundMediaPlayer = createMediaplayerFromAssets(path);    
 45             mCurrentPath = path;
 46         } 
 47         else {
 48             if (! mCurrentPath.equals(path)){
 49                 //播放一个新的背景音乐--- play new background music
 50                 //释放旧的资源并生成一个新的----release old resource and create a new one
 51                 if (mBackgroundMediaPlayer != null){
 52                     mBackgroundMediaPlayer.release();                
 53                 }                
 54                 mBackgroundMediaPlayer = createMediaplayerFromAssets(path);
 55                 //记录这个路径---record the path
 56                 mCurrentPath = path;
 57               }
 58         }
 59         
 60         if (mBackgroundMediaPlayer == null){
 61             Log.e(TAG, "playBackgroundMusic: background media player is null");
 62         } else {        
 63             // 若果音乐正在播放或已近中断,停止它---if the music is playing or paused, stop it
 64             mBackgroundMediaPlayer.stop();            
 65             mBackgroundMediaPlayer.setLooping(isLoop);            
 66             try {
 67                 mBackgroundMediaPlayer.prepare();
 68                 mBackgroundMediaPlayer.seekTo(0);
 69                 mBackgroundMediaPlayer.start();                
 70                 this.mIsPaused = false;
 71             } catch (Exception e){
 72                 Log.e(TAG, "playBackgroundMusic: error state");
 73             }            
 74         }
 75     }
 76     
 77     /**
 78      * 停止播放背景音乐
 79      */
 80     public void stopBackgroundMusic(){
 81         if (mBackgroundMediaPlayer != null){
 82             mBackgroundMediaPlayer.stop();
 83             // should set the state, if not , the following sequence will be error
 84             // play -> pause -> stop -> resume
 85             this.mIsPaused = false;
 86         }
 87     }
 88     /**
 89      * 暂停播放背景音乐
 90      */
 91     public void pauseBackgroundMusic(){        
 92         if (mBackgroundMediaPlayer != null && mBackgroundMediaPlayer.isPlaying()){
 93             mBackgroundMediaPlayer.pause();
 94             this.mIsPaused = true;
 95         }
 96     }
 97     /**
 98      * 继续播放背景音乐
 99      */
100     public void resumeBackgroundMusic(){
101         if (mBackgroundMediaPlayer != null && this.mIsPaused){
102             mBackgroundMediaPlayer.start();
103             this.mIsPaused = false;
104         }
105     }
106     /**
107      * 重新播放背景音乐
108      */
109     public void rewindBackgroundMusic(){        
110         if (mBackgroundMediaPlayer != null){
111             mBackgroundMediaPlayer.stop();            
112             try {
113                 mBackgroundMediaPlayer.prepare();
114                 mBackgroundMediaPlayer.seekTo(0);
115                 mBackgroundMediaPlayer.start();
116                 this.mIsPaused = false;
117             } catch (Exception e){
118                 Log.e(TAG, "rewindBackgroundMusic: error state");
119             }            
120         }
121     }
122     /**
123      * 判断背景音乐是否正在播放
124      * @return:返回的boolean值代表是否正在播放
125      */
126     public boolean isBackgroundMusicPlaying(){
127         boolean ret = false;
128         if (mBackgroundMediaPlayer == null){
129             ret = false;
130         } else {
131             ret = mBackgroundMediaPlayer.isPlaying();
132         }
133         return ret;
134     }
135     /**
136      * 结束背景音乐,并释放资源
137      */
138     public void end(){
139         if (mBackgroundMediaPlayer != null){
140             mBackgroundMediaPlayer.release();
141         }
142         //重新“初始化数据”
143         initData();
144     }
145     /**
146      * 得到背景音乐的“音量”
147      * @return
148      */
149     public float getBackgroundVolume(){
150         if (this.mBackgroundMediaPlayer != null){
151             return (this.mLeftVolume + this.mRightVolume) / 2;
152         } else {
153             return 0.0f;
154         }
155     }
156     /**
157      * 设置背景音乐的音量
158      * @param volume:设置播放的音量,float类型
159      */
160     public void setBackgroundVolume(float volume){
161         this.mLeftVolume = this.mRightVolume = volume;
162         if (this.mBackgroundMediaPlayer != null){
163             this.mBackgroundMediaPlayer.setVolume(this.mLeftVolume, this.mRightVolume);
164         }
165     }
166     /**
167      * create mediaplayer for music
168      * @param path the path relative to assets
169      * @return 
170      */
171     private MediaPlayer createMediaplayerFromAssets(String path){
172         MediaPlayer mediaPlayer = null;
173         try{            
174             AssetFileDescriptor assetFileDescritor = mContext.getAssets().openFd(path);
175             mediaPlayer = new MediaPlayer();
176             mediaPlayer.setDataSource(assetFileDescritor.getFileDescriptor(), 
177                     assetFileDescritor.getStartOffset(), assetFileDescritor.getLength());
178             mediaPlayer.prepare();
179             mediaPlayer.setVolume(mLeftVolume, mRightVolume);
180         }catch (Exception e) {
181             mediaPlayer = null;
182             Log.e(TAG, "error: " + e.getMessage(), e);
183         }
184         return mediaPlayer;
185     }
186 }
187 
188