登录 立即注册
安币:

楼主: inta加加

android实现背景音乐播放功能,android添加背景音乐

[复制链接]

443

主题

931

帖子

1974

安币

手工艺人

发表于 2018-5-16 14:25:33 | 显示全部楼层 |阅读模式

            

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

[Java] 查看源文件 复制代码
package com.liu.zhen.utils; 
 
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 backgroundmusic backgroundmusic = null; 
  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; 
 
  private backgroundmusic(context context) { 
    this.mcontext = context; 
    initdata(); 
  } 
 
  public static backgroundmusic getinstance(context context) { 
    if (backgroundmusic == null) { 
      backgroundmusic = new backgroundmusic(context); 
    } 
    return backgroundmusic; 
  } 
 
  // 初始化一些数据 
  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; 
  } 
} 






        

6

主题

9307

帖子

2893

安币

Android大神

Rank: 6Rank: 6

发表于 2018-5-16 15:15:32 | 显示全部楼层
楼主是好人,回个帖会有安币吗?

350

主题

774

帖子

794

安币

手工艺人

发表于 2018-5-16 18:52:16 | 显示全部楼层
感觉楼主很用心,辛苦啦~

8

主题

9073

帖子

3560

安币

码皇(巴士元老)

Rank: 8Rank: 8

发表于 2018-5-16 23:43:12 | 显示全部楼层
不错不错,楼主辛苦了。。。

3

主题

9245

帖子

1810

安币

Android大神

Rank: 6Rank: 6

QQ达人

发表于 2018-5-17 04:46:09 | 显示全部楼层
安卓巴士是个不错的网站,我来顶个贴~

503

主题

955

帖子

2057

安币

手工艺人

发表于 2018-5-17 11:20:41 | 显示全部楼层
不错不错,楼主辛苦了。。。

21

主题

9270

帖子

2063

安币

Android大神

Rank: 6Rank: 6

发表于 2018-5-17 16:58:58 | 显示全部楼层
不错不错,楼主辛苦了。。。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站长推荐

通过邮件订阅最新安卓weekly信息
上一条 /4 下一条

下载安卓巴士客户端

全国最大的安卓开发者社区
联系我们
关闭
合作电话:
15618560077
Email:
805941275@qq.com
商务市场合作/投稿
问题反馈及帮助
联系我们

广告投放| 下载客户端|申请友链|手机版|站点统计|安卓巴士 ( 粤ICP备15117877号 )

快速回复 返回顶部 返回列表