android实现背景音乐播放

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

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;
	}
}

时间: 2024-07-29 22:05:53

android实现背景音乐播放的相关文章

Android实现音乐播放器(一)

Graphical User Interface 本篇文章记录了我实现Android简单音乐播放器的过程,(一)中介绍了怎么构建音乐播放器的前端页面.首先大家看一下,界面最后是这样的(界面有点粗陋) 音乐文件列表是从SD卡中读取出来的. 首先我们先在Layout里面创建Music Player的GUI,diagram如下图所示: 根据diagram我们在activity_main.xml写出如下代码: <LinearLayout xmlns:android="http://schemas.

android之MP3播放器

布局文件 布局文件中设置了三个按钮分别来进行播放.暂停和继续播放 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="mat

[Android应用]音乐播放器

Service是一个不可见的进程在后台执行. Android中的服务,它与Activity不同,它是不能与用户交互的,不能自己启动的,运行在后台的程序,如果我们退出应用时,Service进程并没有结束,它仍然在后台运行,例如我们打开一个音乐播放器来听音乐,在听音乐的同时也想做下其它的事情,比如上网聊Q.或者上网浏览新闻之类的事情.这样的话,我们就需要用到Service服务了.下面我们以一个简单的音乐播放器的实例来说明下Service的生命周期和Service的使用. 下面是音乐播放器Demo的程

小程序页面可以放置转发按钮,同时开放了微信运动步数背景音乐播放等更多基础能力

小程序页面可以放置转发按钮,同时开放了微信运动步数背景音乐播放等更多基础能力.小程序转发更简单了:小程序页面可以放置转发按钮.在小程序页面右上角“…”的转发功能基础上,新增在页面内放置转发按钮,用户点击后,即可将喜欢的内容分享给好友或群聊,体验更加流畅.开发者可以根据小程序的功能,展示最适合的按钮形式. 使用指引 转发按钮,旨在帮助用户更流畅地与好友分享内容和服务.转发,应是用户自发的行为,且在需要时触手可及.开发者在使用时若遵从以下指引,会得到更佳的用户体验. 含义清晰:明确.一目了然的图形按

【第一篇章-android平台buffer播放探索】Steaming Source Player

为了在android平台找到buffer播放方式,花了不少功夫,在这个探索过程中,果断否定了native media的方式,在找到Steaming Source Player之前还进行了一次Nuplayer的尝试,我们把android里面的Nuplayer单独独立出来可进行NDK编译用加载库的方式跑起来,在三星以及小米的手机上跑是没有问题的,整体功能还算OK,但是想android平台通吃的话,会遇到很多兼容性问题,因为Nuplayer要对接底层OMX相关的模块,并不是每一家对OMX的封装做的到位

最简单的基于FFmpeg的移动端样例附件:Android 自带播放器

===================================================== 最简单的基于FFmpeg的移动端样例系列文章列表: 最简单的基于FFmpeg的移动端样例:Android HelloWorld 最简单的基于FFmpeg的移动端样例:Android 视频解码器 最简单的基于FFmpeg的移动端样例:Android 视频解码器-单个库版 最简单的基于FFmpeg的移动端样例:Android 推流器 最简单的基于FFmpeg的移动端样例:Android 视频转

Android——简单音乐播放器

使用MediaPlayer做的简单音乐播放器,更多内容请到百度经验查看   http://jingyan.baidu.com/article/60ccbceb63452364cab197f1.html <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:l

Android命令行播放MP3音乐

/*************************************************************************** * Android命令行播放MP3音乐 * 说明: * 有时候我们会遇到Touch不能使用,也没有鼠标,但是我们要在Android上测试 * 声卡情况,所以我们会想到在adb或者debug终端上使用命令行来播放声音. * * 2016-5-26 深圳 南山平山村 曾剑锋 *************************************

android调用音乐播放器,三种方

小弟想请问一下,如何在自己写的程序中调用系统的音乐播放器呢. 我在google上搜索了,主要是有两种方法,但是都不是我想要的. 第一种是,使用mp3音乐文件的uri,和intent,进行调用,但是这种是针对某一首歌曲的播放使用的. /** * 播放指定名称的歌曲 * @param audioPath 指定默认播放的音乐 */ public static void playAudio(String audioPath){ Intent mIntent = new Intent(); mIntent