背景音乐播放

import android.content.Context;
   import android.content.res.AssetFileDescriptor;
   import android.media.MediaPlayer;
   import android.util.Log;
   
   /**
    * 
    * This class is used for controlling background music
   *
   */
  public class BackgroundMusic {
      
      private static final String TAG = "Bg_Music";
      private float mLeftVolume;
      private float mRightVolume;
      private Context mContext;
      private MediaPlayer mBackgroundMediaPlayer;
      private boolean mIsPaused;
      private String mCurrentPath;
  
      public BackgroundMusic(Context context){
          this.mContext = context;
          initData();
      }
      //初始化一些数据
      private void initData(){
              mLeftVolume =0.5f;
              mRightVolume = 0.5f;
              mBackgroundMediaPlayer = null;
              mIsPaused = false;
              mCurrentPath = null;
     }
      
      /**
       * 根据path路径播放背景音乐
       * @param path :assets中的音频路径
       * @param isLoop  :是否循环播放
       */
      public void playBackgroundMusic(String path, boolean isLoop){
          if (mCurrentPath == null){
              //这是第一次播放背景音乐--- it is the first time to play background music
              //或者是执行end()方法后,重新被叫---or end() was called
              mBackgroundMediaPlayer = createMediaplayerFromAssets(path);    
              mCurrentPath = path;
          } 
          else {
              if (! mCurrentPath.equals(path)){
                  //播放一个新的背景音乐--- play new background music
                  //释放旧的资源并生成一个新的----release old resource and create a new one
                  if (mBackgroundMediaPlayer != null){
                      mBackgroundMediaPlayer.release();                
                  }                
                  mBackgroundMediaPlayer = createMediaplayerFromAssets(path);
                  //记录这个路径---record the path
                  mCurrentPath = path;
                }
         }
       
          if (mBackgroundMediaPlayer == null){
              Log.e(TAG, "playBackgroundMusic: background media player is null");
          } else {        
              // 若果音乐正在播放或已近中断,停止它---if the music is playing or paused, stop it
              mBackgroundMediaPlayer.stop();            
              mBackgroundMediaPlayer.setLooping(isLoop);            
              try {
                  mBackgroundMediaPlayer.prepare();
                  mBackgroundMediaPlayer.seekTo(0);
                 mBackgroundMediaPlayer.start();                
                  this.mIsPaused = false;
              } catch (Exception e){
                  Log.e(TAG, "playBackgroundMusic: error state");
             }            
          }
      }
      
      /**
       * 停止播放背景音乐
       */
      public void stopBackgroundMusic(){
          if (mBackgroundMediaPlayer != null){
              mBackgroundMediaPlayer.stop();
              // should set the state, if not , the following sequence will be error
              // play -> pause -> stop -> resume
              this.mIsPaused = false;
          }
      }
      /**
       * 暂停播放背景音乐
       */
      public void pauseBackgroundMusic(){        
          if (mBackgroundMediaPlayer != null && mBackgroundMediaPlayer.isPlaying()){
              mBackgroundMediaPlayer.pause();
              this.mIsPaused = true;
          }
      }
      /**
       * 继续播放背景音乐
       */
     public void resumeBackgroundMusic(){
         if (mBackgroundMediaPlayer != null && this.mIsPaused){
             mBackgroundMediaPlayer.start();
             this.mIsPaused = false;
         }
     }
     /**
      * 重新播放背景音乐
      */
     public void rewindBackgroundMusic(){        
         if (mBackgroundMediaPlayer != null){
             mBackgroundMediaPlayer.stop();            
             try {
                 mBackgroundMediaPlayer.prepare();
                 mBackgroundMediaPlayer.seekTo(0);
                 mBackgroundMediaPlayer.start();
                 this.mIsPaused = false;
             } catch (Exception e){
                 Log.e(TAG, "rewindBackgroundMusic: error state");
             }            
         }
     }
     /**
      * 判断背景音乐是否正在播放
      * @return:返回的boolean值代表是否正在播放      */
     public boolean isBackgroundMusicPlaying(){
         boolean ret = false;
         if (mBackgroundMediaPlayer == null){
             ret = false;
         } else {
             ret = mBackgroundMediaPlayer.isPlaying();
         }
         return ret;
     }
     /**
      * 结束背景音乐,并释放资源
      */
     public void end(){
         if (mBackgroundMediaPlayer != null){
             mBackgroundMediaPlayer.release();
         }
         //重新“初始化数据”
         initData();
     }
     /**
      * 得到背景音乐的“音量”
      * @return
      */
     public float getBackgroundVolume(){
         if (this.mBackgroundMediaPlayer != null){
             return (this.mLeftVolume + this.mRightVolume) / 2;
         } else {
             return 0.0f;
         }
     }
     /**
      * 设置背景音乐的音量
      * @param volume:设置播放的音量,float类型
      */
     public void setBackgroundVolume(float volume){
         this.mLeftVolume = this.mRightVolume = volume;
         if (this.mBackgroundMediaPlayer != null){
             this.mBackgroundMediaPlayer.setVolume(this.mLeftVolume, this.mRightVolume);
         }
     }
     /**
      * create mediaplayer for music
      * @param path the path relative to assets
      * @return 
      */
     private MediaPlayer createMediaplayerFromAssets(String path){
         MediaPlayer mediaPlayer = null;
         try{            
             AssetFileDescriptor assetFileDescritor = mContext.getAssets().openFd(path);
             mediaPlayer = new MediaPlayer();
             mediaPlayer.setDataSource(assetFileDescritor.getFileDescriptor(), 
                     assetFileDescritor.getStartOffset(), assetFileDescritor.getLength());
             mediaPlayer.prepare();
             mediaPlayer.setVolume(mLeftVolume, mRightVolume);
         }catch (Exception e) {
             mediaPlayer = null;
             Log.e(TAG, "error: " + e.getMessage(), e);
         }
         return mediaPlayer;
     }
 }
 
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值