android中服务播放音乐,android中用Service播放音乐
一般的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播放音乐相关推荐
- android中服务播放音乐,为什么我们需要Android中的服务?音乐播放也可以通过后台线程完成...
采访中有人问我这个问题.我不确定这是否是问这个问题的合适论坛,因为它不涉及任何代码,而是对android概念的理解. 问题是"当所有事情都可以通过Android中的后台线程完成时,为什么我们 ...
- android同步服务启动失败,android – FirebaseCloudMessaging:FirebaseInstanceId后台同步失败 – SERVICE_NOT_AVAILABLE...
我已在Android中使用Firebase云消息传递(FCM)API进行推送通知.当我实现那个时间完美的工作,但现在它找不到谷歌播放的服务. 错误是: FirebaseInstanceId: back ...
- Android中AMS工作原理,Android AMS启动详解
启动 在Android系统启动流程中中我们提到过,AMS是在system_service中启动的, //frameworks/base/services/java/corri/android/serv ...
- android中bmob云存储,Android中的Bmob移动后端云服务器功能
PS:一般情况下,我们在写android程序的时候,想要实现登录注册功能,可以选择自己用servlet作为服务端来实现过滤没有注册过的用户,但是太麻烦,而且不是随时都可以用的.这里介绍一个移动后端云服 ...
- android中edittext设置密码格式,Android 自定义EditText(带清理、密码可见、不可见)...
实际开发中经常会遇到输入框,各种不同的需求,在一般情况下,清除内容,以及密码可见与不可见基本很常见,那么不废话直接上代码! 在res\values\attrs.xml中 .java import an ...
- android中开启线程处理,Android线程与消息处理
一.实现多线程 1.创建线程 (1)通过Thread创建线程 Thread thread = new Thread(new Runnable(){ @Override public void run( ...
- android中怎么网络判断,Android中判断网络是否连接实例详解
Android中判断网络是否连接实例详解 在android中,如何监测网络的状态呢,这个有的时候也是十分重要的,方法如下: public class ConnectionDetector { priv ...
- android中自适应布局教程,Android自适应布局设计技巧
由于目前在做的一款app需要适配手机和平板,所以我在研究怎么构建可适应所有屏幕尺寸的布局方法. 在web的自适应布局上我有很多经验,比如使用网格流,CSS3中的media queries属性等等,这些 ...
- 【Android 安装包优化】Android 中使用 SVG 图片 ( Android 5.0 以下的矢量图方案 | 矢量图生成为 PNG 图片 )
文章目录 一.Android 5.0 以下的矢量图方案 二.矢量图生成为 PNG 图片 三.完整的 build.gradle 构建脚本 四.编译效果 五.参考资料 一.Android 5.0 以下的矢 ...
最新文章
- 参数化模型(parametric model)和非参数化模型non-parametric model)的区别?哪些模型是参数化模型,哪些模型是非参数化模型?
- vue-ueditor 后端配置项没有正常加载_揭秘Gannt后端集成问题该如何解决
- time datetime 模块
- php中sql where,sql?where
- 发现一款绿色toolbar工具
- NFS网络文件共享存储服务器
- Hibernate一对多单向关联和双向关联映射方法及其优缺点
- 更有效的加载较大的Bitmap
- OpenGL ES之纹理翻转的解决策略
- 完解决MySQL57版登录报ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)的问题
- 【Spark】SparkStreaming-提交到集群运行
- 如何在苹果Mac上设置实时文本(RTT)?
- IR2130与MOSFET驱动电路分析
- 一个小小的Java表白小代码
- mysql 不等于 符号写法
- 11个趣味段子,个个蕴含深刻哲理!
- springboot基于微信小程序的选课系统毕业设计源码060000
- 制作一幅好地图的10个技巧
- 7723java世界Ol,你不知道的《世界OL》
- Android自定义成长值、等级、积分进度条(带属性动画)
热门文章
- 场地测量的方法和程序_施工测量的基本方法
- Hololens开发笔记
- 2016 song list
- 【深度学习论文阅读】TCN:An Empirical Evaluation of Generic Convolutional and Recurrent Networks for Sequence
- c语言编程快速收敛的圆周率计算,[原创]圆周率PI的计算(精确到几十万位)
- 如何利用自己的数据制作社交地图?只显示可视区域内的标注
- android 电视怎么投屏,安卓手机怎么投屏到电视
- 淘宝/天猫采集商家信息插件
- CTF-Crypto学习1(软件加壳、反汇编、Babe64、Rijndael密码算法)
- linux 硬盘报错日志,Linux内核I/O系统报错日志与硬盘故障对应关系