背景音乐功能

  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  
时间: 2024-08-07 08:40:10

背景音乐功能的相关文章

Android在游戏中实现背景音乐功能

1.要在游戏中添加背景音乐  首先你要先增加一个类,这个类是继承Service的,如下.package com.example.android.snake; import android.app.Service; import android.content.Intent;import android.media.MediaPlayer;import android.os.IBinder; public class MusicServer extends Service { private Me

(第十二周)新功能WBS

项目名:食物链教学工具 组名:奋斗吧兄弟 组长:黄兴 组员:李俞寰.杜桥.栾骄阳.王东涵 新增加的功能:背景音乐 功能 子功能 二级子功能 预计花费时间(小时) 实际花费时间(小时) 背景音乐 界面组件布局   0.3 0.3 嵌入音乐资源   0.5 1.5 播放 开始播放 0.5 2.5 停止播放 0.2 0.2 切换曲目 0.5 0.8

短视频 SDK 功能点技术实现方式详解

第三方短视频解决方案作为快速切入短视频行业的首选方式,选择一款功能齐全.性能优异的短视频解决方案十分重要. 今天我们来谈谈短视频 SDK 6大重要功能点及其技术实现方式. 短视频拍摄 断点续拍 指在拍摄过程中可以进行分段式拍摄,并将最终拍摄的所有内容合成一个视频的功能. 通过断点续拍功能可以轻松实现不同的视频内容拼接,快速打造出视频拼接功能,进一步强化平台高质量的内容输出. △ 断点拍摄功能 技术实现 断点续拍功能实现需要在进行断点拍摄时直接调用系统 API 或 第三方的相机库,将每一段 mov

Final版本发布评论

1.飞天小女警组做的礼物挑选小工具,相比较beta版本并没有太大的改动,新增添了"猜你喜欢"模块,在最后给出的礼物推荐下面会给出三个猜你喜欢的礼物.这样解决了推荐礼物的单一,也让礼物推荐变得更有趣了. 2.金州勇士组做的考试系统,final版本整体来看做得很不错,并对用户角色做了详尽的区分,功能演示说明的也很详细. 3.新锋组的俄罗斯方块小游戏,较之前的beta版本,对界面进行了较大的改善,可以通关关卡变换来变换背景图案,还增加了开挂的功能让分数迅速上升,final版本的游戏已经很成熟

Final版本评论

F 飞天小女警:礼物挑选工具新增猜你喜欢功能,在推荐一款礼物的同时,在下方列出其它可能符合要求的礼物,用户可选礼物范围增大了. 奋斗吧兄弟:增加了背景音乐功能,并提供四首乐曲进行切换.连线操作不太方便,期待改进. J 金州勇士:在线考试系统中管理员和教师的分类更加细致,从题库随机生成试卷的功能也很实用. N nice!:约跑是手机项目,用户使用起来更加方便,后序如果开发ios版一定会更好. T 天天向上:连连看游戏基本功能完成很好,还增加了特定情况下消除可以获取道具的规则,很有趣味性. X 新蜂

(第九周)团队项目16

项目名:食物链教学工具 组名:奋斗吧兄弟 组长:黄兴 组员:李俞寰.杜桥.栾骄阳.王东涵 代码地址:HTTPS: https://git.coding.net/li_yuhuan/FoodChain.git SSH: [email protected]:li_yuhuan/FoodChain.git SCRUM会议: 时间:2016.11.9   12:20--13:20 地点:冬华楼一楼大厅 会议内容: 已完成的内容: 1.完成自定义生物功能. 计划完成的内容: 1.黄兴:分配任务,上传视频到

Android中startService的使用及Service生命周期

Android中有两种主要方式使用Service,通过调用Context的startService方法或调用Context的bindService方法,本文只探讨startService的使用,不涉及任何bindService方法调用的情况. 当我们通过调用了Context的startService方法后,我们便启动了Service,通过startService方法启动的Service会一直无限期地运行下去,只有在外部调用Context的stopService或Service内部调用Servic

C++的简单“五子棋”游戏,只是核心代码,资源代码未添加

ChessBoard.h 1 #ifndef __CHESS_BOARD_H__ 2 #define __CHESS_BOARD_H__ 3 4 #include "DataStruct.h" 5 6 #define COL_WIDTH 45 7 #define ROW_WIDTH 45 8 9 class CChessBoard : public CWnd 10 { 11 private: 12 CBitmap m_bitBlackChess, m_bitWhiteChess; 13

Android Service的两种启动方式

参考链接 1. 概念 开始,先稍稍讲一点android中Service的概念和用途吧~ Service分为本地服务(LocalService)和远程服务(RemoteService): 1.本地服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外Local服务因为是在同一进程因此不需要IPC, 也不需要AIDL.相应bindService会方便很多.主进程被Kill后,服务便会终止. 2.远程服务为独立的进程,对应进程名格式为所在包名加上你指定的android:process字符