一、android 音频播放类
  MediaPlayer和SoundPool都可以用来播放音频。
区别是MediaPlayer占用资源高,延迟时间高,播放长音乐的,并且不能同时播放多个音乐,
而SoundPool占用资源较少,没什么延迟,但要提前加载,只能播放1M以下的音频文件,能同时播放多个音乐
因此MediaPlayer一般用来播放背景音乐,而SoundPool主要用来播放游戏音效。

1、MediaPlayer

 //获取实例:
MediaPlayer.create(Context context,int resId); //参数一:上下文对象,参数二:音乐资源ID,一般放在raw文件夹下。如果没有raw就自己创建一个 //常用方法:
prepare();//为播放音乐文件做准备工作
start();//播放音乐
pause();//暂停音乐播放
stop();//停止音乐播放 //MediaPlayer其它常用函数
setLooping(boolean looping);//设置音乐是否循环播放,true为循环播放
seekTo(int msec);//将音乐播放跳转到某一时间点,以毫秒为单位
getDuration();//获取播放的音乐文件总时间长度
getCurrentPosition();//获取当前播放音乐时间点

注:pause()和stop(),主要的区别在于:暂停播放后可以调用start()继续播放,停止音乐播放后,需要调用prepare()再调用start()进行播放音乐。

当然不得不提AudioManager(音乐管理类,可以获取当前音乐大小以及最大音量)

 // 获取实例
AudioManager am = new AudioManager(); //常用方法:
setStreamVolume(imt streamType,int index,int flags) ;//设置音量大小,参数一:音乐类型(AudioManager.STREAM_MUSIC),参数二:音量大小,参数三:设置一个或者多个标志
getStreamVolume(int streamType);//获取当前音量大小,参数 获取音量大小类型
getStreamMaxVolume(int streamType);// 获取当前音量最大值,参数获取音量大小的类型

2、SoundPool

获取实例:

 //参数一:允许同时播放的声音最大值,参数二:声音类型,参数三:声音品质
new SoundPool(int maxStreams,int streamType,int srcQuality);

常用方法:

 //加载音乐文件,返回音乐ID(音乐流文件数据) 参数一:Context实例,参数二:音乐文件ID,
//参数三:标志优先考虑的声音。目前使用没有任何效果,只是具备兼容性价值。一般写个1就可以。
int load(Context context,int resId,int priority);
//音乐播放,播放失败返回0,正常则返回非0值,参数一:加载后得到的音乐文件,参数二:音量的左声道 范围0.0~1.0 参数三:音量的右声道,范围 0.0~1.0
//参数四:音乐流的优先级,0为最低优先级,参数五:音乐播放次数,-1表示无限循环,0表示正常一次,大于0则表示循环次数,
//参数六:播放速率,取值范围:0.5~2.0,1.0表示正常播放。
int play(int soundId,float leftVolume,float rightVolume,int proority,int loop,float rate);
pause(int streamID); //暂停音乐播放 ,参数:音乐文件加载后的流ID
stop(int streamID) ; //结束音乐播放 参数:音乐文件加载后的流ID
release(); //释放SoundPool的资源
setLoop(int streamID,int loop); //设置循环次数 参数一:音乐文件加载后的流ID,参数二:循环次数
setReat(int streamID); //设置播放速率
setVolume(int streamID,float leftVolume,float rightVolume); //设置音量大小,参数二:左声道音量,参数三:右声道音量
setPriority(int streamID,int priority); //设置流的优先级,参数二:优先级值。

3、基于MediaPlayer的简单播放器

  导入drawable-mdpi(我一般是传入这个drawable文件夹的) 三张播放、暂停、停止的图片,res下新建raw文件夹并导入ten_year.mp3文件,注意Android的资源文件都不能中文和大写字母命名。

Activity主要代码:

private ImageButton btn_start, btn_stop, btn_pause;
private TextView tv;
private MediaPlayer mp;
// 声明一个变量判断是否为暂停,默认为false
private boolean isPaused = false; public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // 通过findViewById找到资源
btn_start = (ImageButton) findViewById(R.id.btn_start);
btn_stop = (ImageButton) findViewById(R.id.btn_stop);
btn_pause = (ImageButton) findViewById(R.id.btn_pause);
tv = (TextView) findViewById(R.id.myTextView1); // 创建MediaPlayer对象,将raw文件夹下的ten_year.mp3
mp = MediaPlayer.create(this, R.raw.ten_year);
// 增加播放音乐按钮的事件
btn_start.setOnClickListener(new ImageButton.OnClickListener() {
@Override
public void onClick(View v) {
try {
if (mp != null) {
mp.stop();
}
mp.prepare();
mp.start();
tv.setText("音乐播放中...");
} catch (Exception e) {
tv.setText("播放发生异常...");
e.printStackTrace();
}
}
}); btn_stop.setOnClickListener(new ImageButton.OnClickListener() {
@Override
public void onClick(View v) {
try {
if (mp != null) {
mp.stop();
tv.setText("音乐停止播放...");
}
} catch (Exception e) {
tv.setText("音乐停止发生异常...");
e.printStackTrace();
} }
}); btn_pause.setOnClickListener(new ImageButton.OnClickListener() {
@Override
public void onClick(View v) {
try {
if (mp != null) {
if (isPaused == false) {
mp.pause();
isPaused = true;
tv.setText("暂停播放!");
} else if (isPaused == true) {
mp.start();
isPaused = false;
tv.setText("继续播放!");
}
}
} catch (Exception e) {
tv.setText("发生异常...");
e.printStackTrace();
} }
}); /* 当MediaPlayer.OnCompletionLister会运行的Listener */
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
// @Override
/* 覆盖文件播出完毕事件 */
public void onCompletion(MediaPlayer arg0) {
try {
/*
* 解除资源与MediaPlayer的赋值关系 让资源可以为其它程序利用
*/
mp.release();
/* 改变TextView为播放结束 */
tv.setText("音乐播发结束!");
} catch (Exception e) {
tv.setText(e.toString());
e.printStackTrace();
}
}
}); /* 当MediaPlayer.OnErrorListener会运行的Listener */
mp.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
/* 覆盖错误处理事件 */
public boolean onError(MediaPlayer arg0, int arg1, int arg2) {
// TODO Auto-generated method stub
try {
/* 发生错误时也解除资源与MediaPlayer的赋值 */
mp.release();
tv.setText("播放发生异常!");
} catch (Exception e) {
tv.setText(e.toString());
e.printStackTrace();
}
return false;
}
});
}

运行项目,聆听音乐!

4、GameSoundPool音效播放的工具类

  由于音效的音频文件太多了,建个map来管理,当要播放那个音效时,传入相应的id即可。

主要代码:

public class GameSoundPool {
private MainActivity mainActivity;
private SoundPool soundPool;
private HashMap<Integer,Integer> map; public GameSoundPool(MainActivity mainActivity){
this.mainActivity = mainActivity;
map = new HashMap<Integer,Integer>();
soundPool = new SoundPool(8,AudioManager.STREAM_MUSIC,0);
} public void initGameSound(){
map.put(1, soundPool.load(mainActivity, R.raw.shoot, 1));
map.put(2, soundPool.load(mainActivity, R.raw.explosion, 1));
map.put(3, soundPool.load(mainActivity, R.raw.explosion2, 1));
map.put(4, soundPool.load(mainActivity, R.raw.explosion3, 1));
map.put(5, soundPool.load(mainActivity, R.raw.bigexplosion, 1));
map.put(6, soundPool.load(mainActivity, R.raw.get_goods, 1));
map.put(7, soundPool.load(mainActivity, R.raw.button, 1));
}
//播放音效
public void playSound(int sound,int loop,boolean flag){
AudioManager am = (AudioManager)mainActivity.getSystemService(Context.AUDIO_SERVICE);
float stramVolumeCurrent = am.getStreamVolume(AudioManager.STREAM_MUSIC);
float stramMaxVolumeCurrent = am.getStreamVolume(AudioManager.STREAM_MUSIC);
float volume = stramVolumeCurrent/stramMaxVolumeCurrent;
if(flag) {
soundPool.play(map.get(sound), volume, volume, 1, loop, 1.0f);
} }
}

由于游戏画面经常会有按钮点击关闭音效,这里的flag 参数主要用于控制是否播放。播放时调用

GameSoundPool.playSound(key, 0,soundFlag); 即可,key是定义具体的音效id,当然我们也可以为了代码可读行写成静态全局变量传进来。

android学习日记11--音频播放类的更多相关文章

  1. android学习日记03--常用控件Dialog

    常用控件 9.Dialog 我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择.这些功能我们叫它Android Dialog对话框 对话框,要创建对话框之前首先要创建Bui ...

  2. android学习日记03--常用控件button/imagebutton

    常用控件 控件是对数据和方法的封装.控件可以有自己的属性和方法.属性是控件数据的简单访问者.方法则是控件的一些简单而可见的功能.所有控件都是继承View类 介绍android原生提供几种常用的控件bu ...

  3. android学习日记05--Activity间的跳转Intent实现

    Activity间的跳转 Android中的Activity就是Android应用与用户的接口,所以了解Activity间的跳转还是必要的.在 Android 中,不同的 Activity 实例可能运 ...

  4. android学习日记03--常用控件checkbox/radiobutton

    常用控件3.checkbox 复选框,确定是否勾选,点击一下勾选,点击第二下取消,当有一系列备选项时适合用checkbox控件,方便用户提交数据. 贴上例子Activity的java代码 packag ...

  5. 【Android】20.1 音频播放

    分类:C#.Android.VS2015: 创建日期:2016-03-11 一.简介 MediaPlayer:适合每次播放一个音频资源或者音频文件的场合. SoundPool:适合同时播放多个音频资源 ...

  6. android学习日记09--BitMap操作

    Bitmap android里的图像处理重要的类,支持jpg.png.bmp等格式的图像,BitmapDrawable是封装Bitmap的一个对象,Bitmap实现在android.graphics包 ...

  7. android学习日记08--Paint画笔

    Paint 要绘图,首先得调整画笔,待画笔调整好之后,再将图像绘制到画布Canvas上,这样才可以显示在手机屏幕上.Android 中的画笔是 Paint类,Paint 中包含了很多方法对其属性进行设 ...

  8. Android学习系列(11)--App列表之拖拽ListView(下)

    接着上篇Android学习系列(10)--App列表之拖拽ListView(上)我们继续实现ListView的拖拽效果. 7.重写onTouchEvent()方法.     在这个方法中我们主要是处理 ...

  9. 2016年3月11日Android学习日记

    1.调试技巧:当一次调试过后,可以在App重新返回当前的状态,然后再调试,而不用再点击Android studio的Debug按钮. 参考:http://www.2cto.com/kf/201506/ ...

随机推荐

  1. POJ 2318 (叉积) TOYS

    题意: 有一个长方形,里面从左到右有n条线段,将矩形分成n+1个格子,编号从左到右为0~n. 端点分别在矩形的上下两条边上,这n条线段互不相交. 现在已知m个点,统计每个格子中点的个数. 分析: 用叉 ...

  2. SGU 326 Perspective ★(网络流经典构图の竞赛问题)

    [题意]有n(<=20)只队伍比赛, 队伍i初始得分w[i], 剩余比赛场数r[i](包括与这n只队伍以外的队伍比赛), remain[i][j]表示队伍i与队伍j剩余比赛场数, 没有平局, 问 ...

  3. 各种兼容的placeholder

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  4. 【转】Android中removeCallbacks失效原因

    原文网址:http://blog.sina.com.cn/s/blog_6714fba70100wtx1.html 在Android开发中会使用Handle的removeCallbacks函数,该函数 ...

  5. (八)学习CSS之line-style-type属性

    参考:http://www.w3school.com.cn/cssref/pr_list-style-type.asp 设置不同的列表样式: ul.circle {list-style-type:ci ...

  6. 也用 Log4Net 之将自定义属性记录到文件中 (三)

    也用 Log4Net  之将自定义属性记录到文件中 (三)  即解决了将自定义属性记录到数据库之后.一个新的想法冒了出来,自定义属性同样也能记录到文件中吗?答案是肯定的,因为Log4Net既然已经考虑 ...

  7. C# DataGridView绑定数据源的几种常见方式

    开始以前,先认识一下WinForm控件数据绑定的两种形式,简单数据绑定和复杂数据绑定. 1. 简单的数据绑定 例1 using (SqlConnection conn = new SqlConnect ...

  8. 仿酷狗音乐播放器开发日志三——修复CEditUI的bug2

    无意中发现了CEditUI控件的另一个bug,当我给播放器的搜索栏获取焦点时,这时再改变窗体大小,原本搜索栏应该对应着也改变大小,却发现CEditUI内嵌的edit控件没有跟着改变(如下图),跟着调试 ...

  9. PHP 进行蜘蛛访问日志统计

    $useragent = addslashes(strtolower($_SERVER['HTTP_USER_AGENT'])); if (strpos($useragent, 'googlebot' ...

  10. ios开发中常用的也是最基本的mysql语句

    MySQL常用基本SQL语句小结——(转) sql语言不经常用,每次再用都隔好久的时间,以致最基本的都想不起来了,只好转一篇记着= - 找的时候方便 SQL分类:  DDL—数据定义语言(CREATE ...