参考了一下网上比人写的,再使用的时候是放在新开的线程中来播放音乐的,后来发现每次进入Activity后就会重复开始一个音乐播放的声音。为了避免重复开启播放功能我在原来代码的基础上增加了单例模式。这样就避免了出现重复播放。

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

android实现背景音乐播放相关推荐

  1. Android 实现背景音乐的播放及震动

    Android 实现背景音乐的播放及震动 一.实现音乐应用 1.播放背景音乐 基础 Android支持一般音乐格式,如mid格式,mp3格式. 将要引用的音频文件放入文件夹"res/raw& ...

  2. Android实现mp3分析,Android编程实现播放MP3功能示例

    本文实例讲述了Android编程实现播放MP3功能.分享给大家供大家参考,具体如下: 在android中播放mp3非常简单,也是项目中经常使用的,比如说要做项目的背景音乐,应用中某些功能的提示音等的. ...

  3. android播放mp3功能,Android编程实现播放MP3功能示例

    本文实例讲述了android编程实现播放mp3功能.分享给大家供大家参考,具体如下: 在android中播放mp3非常简单,也是项目中经常使用的,比如说要做项目的背景音乐,应用中某些功能的提示音等的. ...

  4. Android开源音乐播放器之播放器基本功能

    系列文章 Android开源在线音乐播放器--波尼音乐 Android开源音乐播放器之播放器基本功能 Android开源音乐播放器之高仿云音乐黑胶唱片 Android开源音乐播放器之自动滚动歌词 An ...

  5. android 音乐播放器 获取sd卡所有音乐文件,Android Studio音乐播放器无法读取SD卡,只有内部存储器...

    我很抱歉,如果这原来是一个愚蠢的问题,它可能会成为一个快速修复,但我只是无法弄清楚.我在android studio中创建了音乐播放器,并且没有任何sdcard上的歌曲不会显示在列表视图中,只有内部内 ...

  6. android 调用系统播放器

    今天,简单讲讲android如何调用手机自带的播放器. 昨天,从服务器下载一个AVI的视频,下载后需要进行播放,所以想调用系统自带的播放器.但是由于很少用到,所以自己当时不知道怎么写,于是在网上查找资 ...

  7. android 自定义MP4播放器

    昨天,在网上找了好多资料,终于做了一个自定义的播发器. 视频播放方式 在Android中播放视频的方式有两种: 1.使用MediaPlayer结合SurfaceView进行播放.其中通过Surface ...

  8. android后台自播放音乐,Android实现后台播放音乐(Service方式)

    Android实现后台播放音乐(Service方式) 实现: 在res文件夹下添加raw文件夹,添加mp3/4格式的音乐文件 注意命名规则只能是a-z,0-9,和下划线_ 不能大写字母和- Andro ...

  9. android开发之播放音乐的方法

    目标: 现有ring.ogg文件,如何在android程序中播放. 解决方法: 1. 在res文件夹中新建raw文件夹,将ring.ogg文件放入raw文件夹中. 2. 在要触发播放的地方添加如下代码 ...

最新文章

  1. win10安装mysql
  2. springboot增删改查案例_大神基于SpringBoot开发一个Restful服务,实现增删改查功能...
  3. 再见!阿里云首席科学家闵万里离职:创办风投基金
  4. Java并发:线程间数据传递和交换
  5. 微信小程序直播为什么这么受欢迎
  6. 安装Ubuntu详细教程
  7. bigworld源码分析(3)——dbMgr分析
  8. 注册表知识:HKEY_LOCAL_MACHINE根键详解
  9. Markdown表情符号简码列表
  10. 如何搭建vue项目,完整搭建vue项目
  11. cgo 数据_华测数据处理软件CGO(CHC Geomatics Office)
  12. Silvaco 学习笔记——solar(太阳能电池标准分析)
  13. 高通、低通、带通 三种滤波器的工作原理
  14. 对话知道创宇丨如何守住内容安全生命线?
  15. 从一线码农到阿里技术合伙人 P11的少林扫地僧多隆,人家牛逼是种习惯
  16. 阳离子微球二氧化硅单分散木莓结构/带正电荷Cd离子修饰介孔二氧化硅(SiO2)表面的制备
  17. 信息课为什么不叫计算机课,信息技术课
  18. 金融入门——质押式回购与买断式回购
  19. 【android】超级详细Android Studio下载安装教程(附:JDK1.8安装教程)
  20. 软件压力测试怎么做?压力测试报告需要多少费用?

热门文章

  1. 其实我们不需要那么大的房子
  2. 能力的齿轮每一次卡不上点的时候都是下一个批评的开始
  3. 【小松教你手游开发】【面试必读(编程基础)】堆和栈的区别(转过无数次的文章)...
  4. python 字符编码的两种方式写法:# coding=utf-8和# -*- coding:utf-8 -*-
  5. php使用curl下载指定大小的文件
  6. 云呼叫中心系统: 引领企业通信产业下一春
  7. MySQL · 源码分析 · 一条insert语句的执行过程
  8. 【转载】解决Windows和Ubuntu时间不一致的问题
  9. JSPatch Convertor 实现原理详解
  10. 【12306图片验证12小时内被破解,验证安全的出路到底在哪?】