背景音乐通常播放时间较长,且文件体积也相对较大。这类资源如果放在内存中,一方面给硬件资源本身就很紧缺的手机造成了负担,另一方面通常也没有这方面的需求,放在内存中,在调用时播放速度较快,而长时音乐文件通常作为背景音乐,速度稍微慢一些并不会影响太大。

android.media.MediaPlayer类是Android中用来控制音频,以及视频的类。应用该类,可以轻松实现对音频的处理。

MediaPlayer各个状态间关系如图:Idle状态为空闲,Initialized状态为初始化,Idle状态加载了音频资源后进入Initialized状态,之后调用prepare()方法就可以进入Prepared状态。在Prepared状态调用start()方法便可播放音乐。

音量的控制是播放音乐中常常用到的,Android中通过AudioManager类来控制音量:

AudioManager通过Context.getSystemService(Context.AUDIO_SERVICE)方法得到调用其他类的实例

public void adjustVolume(int derection, int flags)方法可以调节音量,direction为调节的方向,ADJUST_LOWER减小音量、ADJUST_RAISE增大音量、ADJUST_SAME保持音量不变。flags为标记、通常设置为0

public int getStreamMaxVolume(int streamType)方法得到最大音量

public int getStreamVolume(int stereamType)方法得到当前音量

下面通过一个简单的例子说明:

package wyf.zcl;
import android.app.Activity; //引入相关包
import android.media.AudioManager; //引入相关包
import android.media.MediaPlayer; //引入相关包
import android.os.Bundle; //引入相关包
import android.view.View; //引入相关包
import android.widget.Button; //引入相关包
import android.widget.Toast;
public class MyActivity extends Activity {
/** Called when the activity is first created. */
private Button bPlay; //播放按钮
private Button bPause; //暂停按钮
private Button bStop; //停止按钮
private Button bAdd; //增大音量
private Button bReduce; //降低音量
private boolean pauseFlag=false; //暂停标记,true暂停态,false非暂停态
MediaPlayer mp; //MediaPlayer引用
AudioManager am; //AudioManager引用
@Override
public void onCreate(Bundle savedInstanceState) { //Activity创建时调用
super.onCreate(savedInstanceState);
setContentView(R.layout.main); //设置Activity的显示内容
bPlay=(Button)findViewById(R.id.ButtonPlay); //播放按钮的实例化
bPause=(Button)findViewById(R.id.ButtonPause); //暂停按钮的实例化
bStop=(Button)findViewById(R.id.ButtonStop); //停止按钮的实例化
bAdd=(Button)findViewById(R.id.ButtonVAdd); //增大音量按钮的实例化
bReduce =(Button)findViewById(R.id.ButtonVReduce);//降低音量按钮的实例化
mp=new MediaPlayer();
am=(AudioManager) this.getSystemService(this.AUDIO_SERVICE);
bPlay.setOnClickListener(new View.OnClickListener() {//播放按钮的监听器
@Override
public void onClick(View v) {
try{
mp.setDataSource("/sdcard/dl.mid"); //加载音频,进入Initialized状态。
}catch(Exception e){e.printStackTrace();}
try{
mp.prepare(); //进入prepared状态。
}catch(Exception e){e.printStackTrace();}
mp.start(); //播放音乐
Toast.makeText(MyActivity.this, "播放音乐", Toast.LENGTH_SHORT).show();
}});
bPause.setOnClickListener(new View.OnClickListener() { //暂停按钮添加监听器
@Override
public void onClick(View v) {
if(mp.isPlaying()){ //如果是在播放态
mp.pause(); //调用暂停方法
pauseFlag=true; //设置暂停标记
}else if(pauseFlag){
mp.start(); //播放音乐
pauseFlag=false; //设置暂停标记
Toast.makeText(MyActivity.this, "暂停播放", Toast.LENGTH_SHORT).show();
}}
});
bStop.setOnClickListener(new View.OnClickListener() { //停止按钮添加监听器
@Override
public void onClick(View v) {
mp.stop(); //停止播放
mp.reset(); //重置状态到uninitialized态
try{
mp.setDataSource("/sdcard/dl.mid"); //加载音频,进入Initialized状态。
}catch(Exception e){e.printStackTrace();}
try{
mp.prepare(); //进入prepared状态。
}catch(Exception e){e.printStackTrace();}
Toast.makeText(MyActivity.this, "停止播放", Toast.LENGTH_SHORT).show();
}});
bAdd.setOnClickListener(new View.OnClickListener() { //音量增大按钮添加监听器
@Override
public void onClick(View v) {
am.adjustVolume(AudioManager.ADJUST_RAISE, 0); //增大音量
System.out.println("faaa");
Toast.makeText(MyActivity.this, "增大音量", Toast.LENGTH_SHORT).show();
}});
bReduce.setOnClickListener(new View.OnClickListener() { //音量降低按钮添加监听器
@Override
public void onClick(View v) {
am.adjustVolume(AudioManager.ADJUST_LOWER, 0); //减小音量
Toast.makeText(MyActivity.this, "减小音量", Toast.LENGTH_SHORT).show();
}});
}
}

代码:http://download.csdn.net/detail/lxq_xsyu/6268203

代码中的音频:

运行结果:

android游戏开发系列(2)——背景音乐播放技术的更多相关文章

  1. android游戏开发系列(1)——迅雷不及掩耳的声音

    这种声音是短而快的声音,应该采用android.media.SoundPool实现. SoundPool的特点: 1. SoundPool载入音乐文件使用了独立的线程,不会阻塞UI主线程的操作.但是这 ...

  2. HTML5游戏开发系列教程10(译)

    原文地址:http://www.script-tutorials.com/html5-game-development-lesson-10/ 最后我们将继续使用canvas来进行HTML5游戏开发系列 ...

  3. HTML5游戏开发系列教程4(译)

    原文地址:http://www.script-tutorials.com/html5-game-development-lesson-4/ 这篇文章是我们继续使用canvas来进行HTML5游戏开发系 ...

  4. Cocos2dx游戏开发系列笔记13:一个横版拳击游戏Demo完结篇

    懒骨头(http://blog.csdn.net/iamlazybone QQ:124774397 ) 写下这些东西的同时 旁边放了两部电影 周星驰的<还魂夜> 甄子丹的<特殊身份& ...

  5. [Android游戏开发]八款开源 Android 游戏引擎 (巨好的资源)

    初学Android游戏开发的朋友,往往会显得有些无所适从,他们常常不知道该从何处入手,每当遇到自己无法解决的难题时,又往往会一边羡慕于 iPhone下有诸如Cocos2d-iphone之类的免费游戏引 ...

  6. Android游戏开发基本知识

    Android游戏开发 手机游戏被业内人士称为继短信之后的又一座金矿.Android虽然基于Java,但是其虚拟机是基于寄存器的,速度得到了很大的提升,这为Android平台上开发游戏提供了坚强的后盾 ...

  7. Android游戏开发实践(1)之NDK与JNI开发03

    Android游戏开发实践(1)之NDK与JNI开发03 前面已经分享了两篇有关Android平台NDK与JNI开发相关的内容.以下列举前面两篇的链接地址,感兴趣的可以再回顾下.那么,这篇继续这个小专 ...

  8. Android游戏开发实践(1)之NDK与JNI开发01

    Android游戏开发实践(1)之NDK与JNI开发01 NDK是Native Developement Kit的缩写,顾名思义,NDK是Google提供的一套原生Java代码与本地C/C++代码&q ...

  9. Android游戏开发实践(1)之NDK与JNI开发02

    Android游戏开发实践(1)之NDK与JNI开发02 承接上篇Android游戏开发实践(1)之NDK与JNI开发01分享完JNI的基础和简要开发流程之后,再来分享下在Android环境下的JNI ...

随机推荐

  1. 洛谷—— P1765 手机_NOI导刊2010普及(10)

    https://www.luogu.org/problem/show?pid=1765#sub 题目描述 一般的手机的键盘是这样的: 1 2 abc 3 def 4 ghi 5 jkl 6 mno 7 ...

  2. 利用朴素贝叶斯(Navie Bayes)进行垃圾邮件分类

    贝叶斯公式描写叙述的是一组条件概率之间相互转化的关系. 在机器学习中.贝叶斯公式能够应用在分类问题上. 这篇文章是基于自己的学习所整理.并利用一个垃圾邮件分类的样例来加深对于理论的理解. 这里我们来解 ...

  3. C语言深度剖析-----数组基础

    数组的概念 数组的大小 实例 内存占用 长度 a[5] 不指定初始值的话,随机给数值 数组地址与数组名 a为数组首地址,&a为数组地址,值相等,意义不同 数组名不可以直接相等 例:主义区分指针 ...

  4. 过滤input框中的特殊字符

    两种方式,我觉得是一样的效果,请看: var charFilter1 = function(str) { var pattern = new RegExp("[`~!@#$^&*() ...

  5. Nginx 设置,设置已经解析的域名,在nginx中没有定义相应server时的默认访问

    https://blog.csdn.net/m_nanle_xiaobudiu/article/details/80785027

  6. jQuery weui Select组件显示指定值

    jQuery weui有个支持单选或者多选的select弹出层,默认他是这样的 第2部分选择什么值,第1部分就显示什么值,一般的场景支持是没问题了,但本次开发碰到了一个问题. 需求描述: 职业名称后面 ...

  7. Android学习笔记(20):时钟(AnalogClock和TextClock)和计时器(Chronometer)

    时钟文本TextClock继承自TextView.是用于显示当前时间的文本框. TextClock支持的XML属性和相关方法 XML属性 相关方法 说明 android:format12Hour se ...

  8. angular风格指南

    原文 https://www.jianshu.com/p/1a0a0a74769a 大纲 综述 1.单一职责 2.命名 3.LIFT-D应用程序结构 4.组件 综述 以下说的准则是根据angular官 ...

  9. Android学习笔记:Home Screen Widgets(2):关于Widget

    通过widget定义,我们在widget列表中看到了我们的TestWidget.当我们拖拽widget到主页时,假设在appwidet-provider中定义了android:configure的ja ...

  10. 用Apache Ivy实现项目里的依赖管理 分类: C_OHTERS 2014-07-06 18:11 564人阅读 评论(0) 收藏

    Apache Ivy是一个管理项目依赖的工具. 它与Maven  Apache Maven 构建管理和项目管理工具已经吸引了 Java 开发人员的注意.Maven 引入了 JAR 文件公共存储库的概念 ...