- 浏览: 929016 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
itzhongyuan:
java Random类详解 -
david_je:
你好,我看到你在C里面回调JAVA里面的方法是在native里 ...
Android NDK开发(1)----- Java与C互相调用实例详解 -
fykyx521:
请求锁是在 oncreate 释放实在ondestroy?? ...
Android如何保持程序一直运行 -
aduo_vip:
不错,总结得好!
Android读取assets目录下的资源 -
f839903061:
给的网址很给力哦!
Android 4.0.1 源码下载,编译和运行
public class AudioTool {
private static final String TAG = "UponAudio";
private static ConcurrentHashMap<Integer, Integer> resId2SoundId = new ConcurrentHashMap<Integer, Integer>();
private static ConcurrentHashMap<Integer, Integer> resId2StreamId = new ConcurrentHashMap<Integer, Integer>();
private static ConcurrentHashMap<Integer, MediaPlayer> resId2Player = new ConcurrentHashMap<Integer, MediaPlayer>();
private static SoundPool soundPool = new SoundPool(5/* 最多同时播放5个音效 */,AudioManager.STREAM_MUSIC, 0/* 默认优先级为最低 */);
public static void preloadEffect(Context context, int resId) {
if (!resId2SoundId.containsKey(resId)) {
int soundId = soundPool.load(context, resId, 0);
if (soundId > 0) {
resId2SoundId.put(resId, soundId);
} else {
Log.d(TAG, "preload effect " + resId + " failed");
}
}
}
public static void playEffect(Context context, int resId) {
if (!resId2SoundId.containsKey(resId)) {// 未load
int soundId = soundPool.load(context, resId, 0);
if (soundId > 0) {
resId2SoundId.put(resId, soundId);
} else {
Log.d(TAG, "load effect " + resId + " failed");
}
}
int streamId = soundPool.play(resId2SoundId.get(resId), 1.0f, 1.0f, 0, 0, 1.0f);
if (streamId > 0) {// play successful
resId2StreamId.put(resId, streamId);
} else {// play failed
Log.d(TAG, "play effect " + resId + " failed");
}
}
/**
* @param resId
*/
public static void pauseEffect(int resId) {
if (!resId2StreamId.containsKey(resId)) {// 并未播放
return;
}
soundPool.pause(resId2StreamId.get(resId));
}
/**
* @param resId
*/
public static void stopEffect(int resId) {
if (!resId2StreamId.containsKey(resId)) {
return;
}
soundPool.stop(resId2StreamId.get(resId));
}
/**
* @param resId
*/
public static void unloadEffect(int resId) {
if (!resId2SoundId.containsKey(resId)) {
return;
}
soundPool.unload(resId2SoundId.get(resId));
resId2SoundId.remove(resId);
resId2StreamId.remove(resId);
}
/**
* 释放所有资源,在程序退出是调用
*/
public static void release() {
soundPool.release();
resId2SoundId.clear();
resId2StreamId.clear();
if (resId2Player.size() > 0) {
for (Map.Entry<Integer, MediaPlayer> entry : resId2Player.entrySet()) {
if (entry.getValue() != null) {
entry.getValue().release();
}
}
}
resId2Player.clear();
}
/**
* @param resId 播放背景音效
*/
public static void playBkgMusicSync(final Context context, final int resId) {
if (resId2Player.containsKey(resId)) {
MediaPlayer player = resId2Player.get(resId);
if (!player.isPlaying()) {// 如果是stop状态,即进入ErrorListener处理
player.start();
}
} else {
final MediaPlayer player = MediaPlayer.create(context, resId);
if (player != null) {
resId2Player.put(resId, player);// 添加到map中
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
player.setLooping(true);
int volume = ((AudioManager) context.getSystemService(Context.AUDIO_SERVICE))
.getStreamVolume(AudioManager.STREAM_MUSIC);
player.setVolume(volume, volume);
player.setOnErrorListener(new OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
mp.release();
resId2Player.remove(resId);
return true;
}
});
player.start();
}
}
}
/**
* @param resId
*/
public static void playBkgMusicAsync(final Context context, final int resId) {
if (resId2Player.containsKey(resId)) {
MediaPlayer player = resId2Player.get(resId);
if (!player.isPlaying()) {// 如果是stop状态,即进入ErrorListener处理
player.start();
}
} else {
final MediaPlayer mp = new MediaPlayer();
try {
AssetFileDescriptor afd = context.getResources().openRawResourceFd(resId);
if (afd == null) {
Log.d(TAG, "can not open raw resource " + resId);
return;
}
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.setLooping(true);
int volume = ((AudioManager) context.getSystemService(Context.AUDIO_SERVICE))
.getStreamVolume(AudioManager.STREAM_MUSIC);
mp.setVolume(volume, volume);
mp.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
Log.d(TAG, "background music " + resId + " prepared");
resId2Player.put(resId, mp);// 添加到map中
mp.start();
}
});
mp.setOnErrorListener(new OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
mp.release();
resId2Player.remove(resId);
return true;
}
});
mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
afd.close();
mp.prepareAsync();
} catch (IOException ex) {
Log.d(TAG, "create failed:", ex);
} catch (IllegalArgumentException ex) {
Log.d(TAG, "create failed:", ex);
} catch (SecurityException ex) {
Log.d(TAG, "create failed:", ex);
}
}
}
public static void pauseBkgMusic(int resId) {
if (resId2Player.containsKey(resId)) {
MediaPlayer mp = resId2Player.get(resId);
if (mp.isPlaying()) {
mp.pause();
}
}
}
public static void stopBkgMusic(int resId) {
if (resId2Player.containsKey(resId)) {
MediaPlayer mp = resId2Player.get(resId);
mp.stop();
}
}
public static void releaseBkgMusic(int resId) {
if (resId2Player.containsKey(resId2Player)) {
MediaPlayer mp = resId2Player.get(resId);
if (mp != null) {
mp.release();
resId2Player.remove(resId);
mp = null;
}
}
}
}
private static final String TAG = "UponAudio";
private static ConcurrentHashMap<Integer, Integer> resId2SoundId = new ConcurrentHashMap<Integer, Integer>();
private static ConcurrentHashMap<Integer, Integer> resId2StreamId = new ConcurrentHashMap<Integer, Integer>();
private static ConcurrentHashMap<Integer, MediaPlayer> resId2Player = new ConcurrentHashMap<Integer, MediaPlayer>();
private static SoundPool soundPool = new SoundPool(5/* 最多同时播放5个音效 */,AudioManager.STREAM_MUSIC, 0/* 默认优先级为最低 */);
public static void preloadEffect(Context context, int resId) {
if (!resId2SoundId.containsKey(resId)) {
int soundId = soundPool.load(context, resId, 0);
if (soundId > 0) {
resId2SoundId.put(resId, soundId);
} else {
Log.d(TAG, "preload effect " + resId + " failed");
}
}
}
public static void playEffect(Context context, int resId) {
if (!resId2SoundId.containsKey(resId)) {// 未load
int soundId = soundPool.load(context, resId, 0);
if (soundId > 0) {
resId2SoundId.put(resId, soundId);
} else {
Log.d(TAG, "load effect " + resId + " failed");
}
}
int streamId = soundPool.play(resId2SoundId.get(resId), 1.0f, 1.0f, 0, 0, 1.0f);
if (streamId > 0) {// play successful
resId2StreamId.put(resId, streamId);
} else {// play failed
Log.d(TAG, "play effect " + resId + " failed");
}
}
/**
* @param resId
*/
public static void pauseEffect(int resId) {
if (!resId2StreamId.containsKey(resId)) {// 并未播放
return;
}
soundPool.pause(resId2StreamId.get(resId));
}
/**
* @param resId
*/
public static void stopEffect(int resId) {
if (!resId2StreamId.containsKey(resId)) {
return;
}
soundPool.stop(resId2StreamId.get(resId));
}
/**
* @param resId
*/
public static void unloadEffect(int resId) {
if (!resId2SoundId.containsKey(resId)) {
return;
}
soundPool.unload(resId2SoundId.get(resId));
resId2SoundId.remove(resId);
resId2StreamId.remove(resId);
}
/**
* 释放所有资源,在程序退出是调用
*/
public static void release() {
soundPool.release();
resId2SoundId.clear();
resId2StreamId.clear();
if (resId2Player.size() > 0) {
for (Map.Entry<Integer, MediaPlayer> entry : resId2Player.entrySet()) {
if (entry.getValue() != null) {
entry.getValue().release();
}
}
}
resId2Player.clear();
}
/**
* @param resId 播放背景音效
*/
public static void playBkgMusicSync(final Context context, final int resId) {
if (resId2Player.containsKey(resId)) {
MediaPlayer player = resId2Player.get(resId);
if (!player.isPlaying()) {// 如果是stop状态,即进入ErrorListener处理
player.start();
}
} else {
final MediaPlayer player = MediaPlayer.create(context, resId);
if (player != null) {
resId2Player.put(resId, player);// 添加到map中
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
player.setLooping(true);
int volume = ((AudioManager) context.getSystemService(Context.AUDIO_SERVICE))
.getStreamVolume(AudioManager.STREAM_MUSIC);
player.setVolume(volume, volume);
player.setOnErrorListener(new OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
mp.release();
resId2Player.remove(resId);
return true;
}
});
player.start();
}
}
}
/**
* @param resId
*/
public static void playBkgMusicAsync(final Context context, final int resId) {
if (resId2Player.containsKey(resId)) {
MediaPlayer player = resId2Player.get(resId);
if (!player.isPlaying()) {// 如果是stop状态,即进入ErrorListener处理
player.start();
}
} else {
final MediaPlayer mp = new MediaPlayer();
try {
AssetFileDescriptor afd = context.getResources().openRawResourceFd(resId);
if (afd == null) {
Log.d(TAG, "can not open raw resource " + resId);
return;
}
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.setLooping(true);
int volume = ((AudioManager) context.getSystemService(Context.AUDIO_SERVICE))
.getStreamVolume(AudioManager.STREAM_MUSIC);
mp.setVolume(volume, volume);
mp.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
Log.d(TAG, "background music " + resId + " prepared");
resId2Player.put(resId, mp);// 添加到map中
mp.start();
}
});
mp.setOnErrorListener(new OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
mp.release();
resId2Player.remove(resId);
return true;
}
});
mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
afd.close();
mp.prepareAsync();
} catch (IOException ex) {
Log.d(TAG, "create failed:", ex);
} catch (IllegalArgumentException ex) {
Log.d(TAG, "create failed:", ex);
} catch (SecurityException ex) {
Log.d(TAG, "create failed:", ex);
}
}
}
public static void pauseBkgMusic(int resId) {
if (resId2Player.containsKey(resId)) {
MediaPlayer mp = resId2Player.get(resId);
if (mp.isPlaying()) {
mp.pause();
}
}
}
public static void stopBkgMusic(int resId) {
if (resId2Player.containsKey(resId)) {
MediaPlayer mp = resId2Player.get(resId);
mp.stop();
}
}
public static void releaseBkgMusic(int resId) {
if (resId2Player.containsKey(resId2Player)) {
MediaPlayer mp = resId2Player.get(resId);
if (mp != null) {
mp.release();
resId2Player.remove(resId);
mp = null;
}
}
}
}
发表评论
-
Android使用binder访问service的方式
2013-08-23 09:42 16311. 我们先来看一个与本地service通信的例子。 pub ... -
android-Service和Thread的区别
2013-08-23 09:17 914servie是系统的组件,它由系统进程托管(servicema ... -
git介绍
2013-08-01 14:49 1035git介绍 使用Git的第一件事就是设置你的名字和email ... -
cocos2d-x学习之自动内存管理和常见宏
2013-07-29 15:41 9081.自动内存管理 1)概述 C++语言默认是 ... -
cocos2dx中利用xcode 调用java中的函数
2013-07-29 11:36 25251. 先把cocos2dx根目录中的 /Users/zhaos ... -
cocos2dx(v2.x)与(v1.x)的一些常用函数区别讲解
2013-07-29 10:35 1109第一个改动: CCLayer初始化 自定义Layer,类名 ... -
xcode与eclipse整合cocos2dx
2013-07-29 10:32 1220文档xcode版本是 204 1. 在xcode中创建coc ... -
git提交代码
2013-07-23 16:00 10531. 在本地创建一个Git的工作空间,在里面创建一个工程(如H ... -
Android.mk的用法和基础
2013-07-19 14:11 4332一个Android.mk file用来向编译系统描述你的源代码 ... -
eclipse配置NDK-Builder命令
2013-07-18 11:02 10351. 2. -
eclipse配置javah命令
2013-07-18 10:48 19931.找到javah命令所在的目录 我的为 /usr/bi ... -
Android SDL2.0 编译
2013-07-17 13:40 19671,下载: wget http://www.libsdl.o ... -
IntelliJ Idea 常用快捷键列表
2013-05-27 10:19 0Alt+回车 导入包,自动修 ... -
android应用后台安装
2013-05-21 12:02 1015android应用后台安装,静默安装的代码实现方法 http ... -
编译linux内核映像
2013-05-21 11:33 962a)准备交叉编译工具链 android代码树中有一个pr ... -
如何单独编译Android源代码中的模块
2013-05-21 11:29 994一. 首先在Android源代码 ... -
Ubuntu安装JDK6和JDK5
2013-05-19 19:04 1006sudo apt-get install sun-java6- ... -
java_jni详解_01
2013-05-08 17:15 956java中的jni 例子HelloWorld 准备过程: 1 ... -
下载android源码 中断解决原因
2013-05-07 15:51 1315解决方法 1. 浏览器登录https://android.go ... -
mac下编译ffmpeg1.1.4
2013-05-07 14:55 1364经过一番网上搜索 与 无数次的编译 终于成功了 下面献上编译 ...
相关推荐
资源为一个专门处理短音效soundPool的工具类,使用起来很方便,封装的很好!使用方法: 1、你只需要在需要的地方调用这个方法进行类初始化 private void initSound() { soundPlay = new SoundPlay(); soundPlay....
多媒体是现代应用的关键特性之一,`android.media`类库提供了AudioManager、MediaPlayer和SoundPool等类,用于音频和视频的播放、录制和管理。通过这些API,开发者可以轻松集成音乐播放器、录音功能和游戏音效。 ##...
2. **使用VideoView**:`VideoView`是Android提供的一种更便捷的方式,它封装了`MediaPlayer`,并可以直接设置布局参数,方便在界面上显示视频。 ```java VideoView videoView = findViewById(R.id.video_view); ...
9.1.2 SoundPool 9.1.3 VideoView 9.1.4 SurfaceView 9.2 摄像头的使用 9.2.1 摄像头意图Intent 9.2.2 Camera类 9.3 小结 练习 实验一 Android开发环境搭建 实验二 界面设计:基本组件 实验三 界面...
了解基本的面向对象编程概念,如类、对象、继承、封装和多态,是开始Android开发的必备知识。 接着,你需要掌握Android Studio,这是一个强大的集成开发环境(IDE),它提供了许多便利的工具,如代码编辑器、调试器...
Android SDK提供MediaPlayer和SoundPool类来播放音效和背景音乐。开发者应学会如何加载、控制和管理音频资源。 此外,Android游戏还需要考虑性能优化,因为移动设备的硬件资源有限。这包括减少内存占用、优化渲染...
Android提供了MediaPlayer和SoundPool类来播放背景音乐和音效。此外,了解如何使用OpenSL ES进行低级音频处理,可以实现更复杂的音频特效。 除此之外,游戏的输入控制、游戏状态管理、网络通信(如多人在线游戏)、...
此外,日志中还提到了HwModule类,这是音频HAL(硬件抽象层)的一部分,用于封装硬件的具体实现,以便于上层软件使用。HwModule包含输入和输出配置文件,以及一些控制输入输出设备的逻辑。 最后,日志中提到了`...
- MediaPlayer和SoundPool:Android提供了多媒体播放组件,用于播放游戏音效或背景音乐。 9. **资源管理**: - 资源文件(如图片、音频、字符串等)通常存放在res目录下,根据不同的设备配置进行适配。 10. **...
在 API 21 (Android 5.0) 之后的版本中,SoundPool() 构造方法已经过时了,需用 SoundPool.Builder 来创建 SoundPool 对象。SoundPool.Builder 对象可执行 setMaxStreams() 方法设置 SoundPool 对象中可加载的最大...
Android SDK提供了MediaPlayer和SoundPool类来播放音频,以及动画框架来实现过渡效果,例如单元格选中时的高亮动画。 6. **PPT和源码**:教程附带的PPT将详细讲解上述各个步骤,帮助学习者理解概念并进行实践。源码...
Android提供了MediaPlayer和SoundPool类用于处理音频播放。 10. **性能优化**:为了保证游戏流畅运行,开发者可能需要对游戏进行性能优化,如减少不必要的渲染,使用高效的算法,或者合理地使用线程。 通过研究这...
对于音频,Android提供了MediaPlayer和SoundPool两个类,分别适用于背景音乐和短小音效的播放。 性能优化是Android游戏开发中不可忽视的一环。开发者需要关注内存管理和CPU使用,避免内存泄漏,合理使用异步任务和...
9. **多媒体支持**: 如果应用包含音效或动画,开发者需要了解如何处理Android的音频和图像资源,可能涉及MediaPlayer或SoundPool类,以及动画框架如ObjectAnimator或ValueAnimator。 10. **游戏逻辑**: 中国象棋的...
Android的MotionEvent类封装了触摸事件的信息,我们可以监听ACTION_DOWN(手指按下)、ACTION_UP(手指抬起)等事件,来控制玩家飞机的移动和射击。 除此之外,为了增加游戏性,还需要设计一套得分系统和生命值管理...
- 高级的计算器应用可能还包括按键音效,这需要用到Android的音频管理API,如`MediaPlayer`或`SoundPool`。 9. **样式和主题**: - 可能包含自定义主题和样式,以改变计算器的视觉外观,这部分代码可能在`res/...
- 集成Android的MediaPlayer或SoundPool播放音效,如地鼠被打中的声音和时间到的声音。 7. **多线程**: - 为了保证游戏流畅性,与用户交互相关的部分(如事件处理)应运行在主线程,而耗时操作(如动画、计时器...
Android的MediaPlayer或SoundPool类可以用于播放音频资源。 8. **分数系统**:根据消除的行数,游戏会计算并更新分数。这涉及到简单的数学运算,以及分数显示控件的更新。 9. **游戏结束条件**:当方块堆积到顶部...
9. **音效与音乐播放**:Android提供MediaPlayer类用于播放音频,但针对游戏,可能需要使用更专业的库如OpenAL或SoundPool来实现音效即时播放和音量控制。 10. **保存与加载游戏进度**:游戏可能需要实现保存和加载...
而SoundPoolMap可能是对SoundPool的进一步封装,它可能包含了一种映射机制,将特定的动作或事件与预先加载的音频文件关联起来,这样当事件发生时,对应的音频就能即时播放。 在实现3D猫Android项目时,开发者首先...