一般的Android应用程序的音乐可以分为背景音乐和点击各种控件时的音效,前者一般为比较大的音乐文件,后者一般为比较小的音乐。在Android中一般用MediaPlayer类处理比较大的音频文件,用SoundPool类处理比较短促的音频文件。

因此,现设计一音乐播放工具类如下:

MusicPlayer

Java代码

importandroid.content.Context;

importandroid.media.AudioManager;

importandroid.media.MediaPlayer;

importandroid.media.SoundPool;

importcom.ruanko.shengji4Android.R;

importcom.ruanko.shengji4Android.model.SysSetting;

publicclassMusicPlayerimplementsMediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener {

privateContext context;

privateMediaPlayer bgPlayer;//播放背景音乐的播放器

privateSoundPool actionMusicPlayer;//播放音效的播放器

privateintsource_da,source_givecard,source_start,source_win,source_calllord;//各种音效的source

publicMusicPlayer(Context context) {//初始化

this.context = context;

this.actionMusicPlayer =newSoundPool(10, AudioManager.STREAM_SYSTEM,5);//这里指定声音池的最大音频流数目为10,声音品质为5大家可以自己测试感受下效果

this.source_da = actionMusicPlayer.load(context, R.raw.da,0);

this.source_givecard = actionMusicPlayer.load(context, R.raw.givecard,0);

this.source_start = actionMusicPlayer.load(context, R.raw.start,0);

this.source_win = actionMusicPlayer.load(context, R.raw.win,0);

this.source_calllord = actionMusicPlayer.load(context, R.raw.calllord,0);

}

publicvoidonCompletion(MediaPlayer mp) {//音频文件播放完成时自动调用

}

publicbooleanonError(MediaPlayer mp,intwhat,intextra) {//音频文件播放发生错误时自动调用

returnfalse;

}

publicvoidplayBgSound(intparamInt) {//播放背景音乐,paramInt为音频文件ID

if(!SysSetting.getInstance(context).isBgSound()) {//SysSetting为一个单例类,是我自己定义的,用于保存本应用程序相关设置,isBgSound()为得到是否开启背景音乐设置

return;

}

stopSound(bgPlayer);

try{

MediaPlayer mediaPlayer = MediaPlayer.create(context, paramInt);

bgPlayer = mediaPlayer;

bgPlayer.setOnCompletionListener(this);

bgPlayer.setLooping(true);//设置是否循环,一般背景音乐都设为true

bgPlayer.start();

}catch(IllegalStateException e) {

e.printStackTrace();

}

}

publicMediaPlayer getBackGroundPlayer() {

returnthis.bgPlayer;

}

publicvoidstopBgSound() {//停止背景音乐的播放

if(bgPlayer ==null)

return;

if(bgPlayer.isPlaying())

bgPlayer.stop();

bgPlayer.release();

bgPlayer =null;

}

privatevoidplaySound(intsource) {//如果系统设置中开启了音效,则播放相关的音频文件

if(SysSetting.getInstance(context).isEffectSound()) {

actionMusicPlayer.play(source,1,1,0,0,1);

}

}

publicvoidplayHitCardSound() {

playSound(source_da);

}

publicvoidplayGiveCardSound() {

playSound(source_givecard);

}

publicvoidplayStartSound() {

playSound(source_start);

}

publicvoidplayWinSound() {

playSound(source_win);

}

publicvoidplayCalllordSound() {

playSound(source_calllord);

}

}

import android.content.Context;

import android.media.AudioManager;

import android.media.MediaPlayer;

import android.media.SoundPool;

import com.ruanko.shengji4Android.R;

import com.ruanko.shengji4Android.model.SysSetting;

public class MusicPlayer implements MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener {

private Context context;

private MediaPlayer bgPlayer; //播放背景音乐的播放器

private SoundPool actionMusicPlayer; //播放音效的播放器

private int source_da,source_givecard,source_start,source_win,source_calllord; //各种音效的source

public MusicPlayer(Context context) { //初始化

this.context = context;

this.actionMusicPlayer = new SoundPool(10, AudioManager.STREAM_SYSTEM,5); //这里指定声音池的最大音频流数目为10,声音品质为5大家可以自己测试感受下效果

this.source_da = actionMusicPlayer.load(context, R.raw.da, 0);

this.source_givecard = actionMusicPlayer.load(context, R.raw.givecard, 0);

this.source_start = actionMusicPlayer.load(context, R.raw.start, 0);

this.source_win = actionMusicPlayer.load(context, R.raw.win, 0);

this.source_calllord = actionMusicPlayer.load(context, R.raw.calllord, 0);

}

public void onCompletion(MediaPlayer mp) { //音频文件播放完成时自动调用

}

public boolean onError(MediaPlayer mp, int what, int extra) { //音频文件播放发生错误时自动调用

return false;

}

public void playBgSound(int paramInt) { //播放背景音乐,paramInt为音频文件ID

if(!SysSetting.getInstance(context).isBgSound()) { //SysSetting为一个单例类,是我自己定义的,用于保存本应用程序相关设置,isBgSound()为得到是否开启背景音乐设置

return;

}

stopSound(bgPlayer);

try {

MediaPlayer mediaPlayer = MediaPlayer.create(context, paramInt);

bgPlayer = mediaPlayer;

bgPlayer.setOnCompletionListener(this);

bgPlayer.setLooping(true); //设置是否循环,一般背景音乐都设为true

bgPlayer.start();

} catch (IllegalStateException e) {

e.printStackTrace();

}

}

public MediaPlayer getBackGroundPlayer() {

return this.bgPlayer;

}

public void stopBgSound() { //停止背景音乐的播放

if(bgPlayer == null)

return;

if(bgPlayer.isPlaying())

bgPlayer.stop();

bgPlayer.release();

bgPlayer = null;

}

private void playSound(int source) { //如果系统设置中开启了音效,则播放相关的音频文件

if(SysSetting.getInstance(context).isEffectSound()) {

actionMusicPlayer.play(source, 1, 1, 0, 0, 1);

}

}

public void playHitCardSound() {

playSound(source_da);

}

public void playGiveCardSound() {

playSound(source_givecard);

}

public void playStartSound() {

playSound(source_start);

}

public void playWinSound() {

playSound(source_win);

}

public void playCalllordSound() {

playSound(source_calllord);

}

}

在activity中怎样使用这个工具类呢?播放背景音乐可能我们一般都想到的是service,但是service对背景音乐的控制比较难,尤其是,在不同场景,需要不时变换背景音乐的情况下,因此,可以考虑自己定义一个activity,继承Activity,在其中定义一个静态的成员变量

Java代码

publicstaticMusicPlayer musicPlayer;

public static MusicPlayer musicPlayer;

并在这个Activity的onCreate方法中初始化该musicPlayer

Java代码

if(musicPlayer ==null) {

SysSetting.getInstance(getApplicationContext()).load();//加载系统设置,SysSetting为我自己定义的一个类,由于代码较长,就不给出了

musicPlayer =newMusicPlayer(getApplicationContext());

musicPlayer.playBgSound(R.raw.welcome);//播放背景音乐

}

if(musicPlayer == null) {

SysSetting.getInstance(getApplicationContext()).load(); //加载系统设置,SysSetting为我自己定义的一个类,由于代码较长,就不给出了

musicPlayer = new MusicPlayer(getApplicationContext());

musicPlayer.playBgSound(R.raw.welcome); //播放背景音乐

}

然后,再将所有的Activity继承于这个自己定义的Activity即可。

android中服务播放音乐,android中用Service播放音乐相关推荐

  1. android中服务播放音乐,为什么我们需要Android中的服务?音乐播放也可以通过后台线程完成...

    采访中有人问我这个问题.我不确定这是否是问这个问题的合适论坛,因为它不涉及任何代码,而是对android概念的理解. 问题是"当所有事情都可以通过Android中的后台线程完成时,为什么我们 ...

  2. android同步服务启动失败,android – FirebaseCloudMessaging:FirebaseInstanceId后台同步失败 – SERVICE_NOT_AVAILABLE...

    我已在Android中使用Firebase云消息传递(FCM)API进行推送通知.当我实现那个时间完美的工作,但现在它找不到谷歌播放的服务. 错误是: FirebaseInstanceId: back ...

  3. Android中AMS工作原理,Android AMS启动详解

    启动 在Android系统启动流程中中我们提到过,AMS是在system_service中启动的, //frameworks/base/services/java/corri/android/serv ...

  4. android中bmob云存储,Android中的Bmob移动后端云服务器功能

    PS:一般情况下,我们在写android程序的时候,想要实现登录注册功能,可以选择自己用servlet作为服务端来实现过滤没有注册过的用户,但是太麻烦,而且不是随时都可以用的.这里介绍一个移动后端云服 ...

  5. android中edittext设置密码格式,Android 自定义EditText(带清理、密码可见、不可见)...

    实际开发中经常会遇到输入框,各种不同的需求,在一般情况下,清除内容,以及密码可见与不可见基本很常见,那么不废话直接上代码! 在res\values\attrs.xml中 .java import an ...

  6. android中开启线程处理,Android线程与消息处理

    一.实现多线程 1.创建线程 (1)通过Thread创建线程 Thread thread = new Thread(new Runnable(){ @Override public void run( ...

  7. android中怎么网络判断,Android中判断网络是否连接实例详解

    Android中判断网络是否连接实例详解 在android中,如何监测网络的状态呢,这个有的时候也是十分重要的,方法如下: public class ConnectionDetector { priv ...

  8. android中自适应布局教程,Android自适应布局设计技巧

    由于目前在做的一款app需要适配手机和平板,所以我在研究怎么构建可适应所有屏幕尺寸的布局方法. 在web的自适应布局上我有很多经验,比如使用网格流,CSS3中的media queries属性等等,这些 ...

  9. 【Android 安装包优化】Android 中使用 SVG 图片 ( Android 5.0 以下的矢量图方案 | 矢量图生成为 PNG 图片 )

    文章目录 一.Android 5.0 以下的矢量图方案 二.矢量图生成为 PNG 图片 三.完整的 build.gradle 构建脚本 四.编译效果 五.参考资料 一.Android 5.0 以下的矢 ...

最新文章

  1. 参数化模型(parametric model)和非参数化模型non-parametric model)的区别?哪些模型是参数化模型,哪些模型是非参数化模型?
  2. vue-ueditor 后端配置项没有正常加载_揭秘Gannt后端集成问题该如何解决
  3. time datetime 模块
  4. php中sql where,sql?where
  5. 发现一款绿色toolbar工具
  6. NFS网络文件共享存储服务器
  7. Hibernate一对多单向关联和双向关联映射方法及其优缺点
  8. 更有效的加载较大的Bitmap
  9. OpenGL ES之纹理翻转的解决策略
  10. 完解决MySQL57版登录报ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)的问题
  11. 【Spark】SparkStreaming-提交到集群运行
  12. 如何在苹果Mac上设置实时文本(RTT)?
  13. IR2130与MOSFET驱动电路分析
  14. 一个小小的Java表白小代码
  15. mysql 不等于 符号写法
  16. 11个趣味段子,个个蕴含深刻哲理!
  17. springboot基于微信小程序的选课系统毕业设计源码060000
  18. 制作一幅好地图的10个技巧
  19. 7723java世界Ol,你不知道的《世界OL》
  20. Android自定义成长值、等级、积分进度条(带属性动画)

热门文章

  1. 场地测量的方法和程序_施工测量的基本方法
  2. Hololens开发笔记
  3. 2016 song list
  4. 【深度学习论文阅读】TCN:An Empirical Evaluation of Generic Convolutional and Recurrent Networks for Sequence
  5. c语言编程快速收敛的圆周率计算,[原创]圆周率PI的计算(精确到几十万位)
  6. 如何利用自己的数据制作社交地图?只显示可视区域内的标注
  7. android 电视怎么投屏,安卓手机怎么投屏到电视
  8. 淘宝/天猫采集商家信息插件
  9. CTF-Crypto学习1(软件加壳、反汇编、Babe64、Rijndael密码算法)
  10. linux 硬盘报错日志,Linux内核I/O系统报错日志与硬盘故障对应关系