标签:
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
标签:
原文地址:http://www.cnblogs.com/zhengyuqi/p/4652606.html