Android使用SoundPool播放短音效
时间:2022-07-27
本文章向大家介绍Android使用SoundPool播放短音效,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
前言
对于Android播放一些简短音效,例如提示音,或者铃声,相对于使用MediaPlayer,SoundPool可以节省更多资源,并且可以同时播放多个音效,而且可以针对不同音效设置不同播放品质
实现
SoundPool的具体作用,就不再阐述,直接贴代码
private SoundPool.Builder spBuilder;
private SoundPool soundPool;
private Integer[] fmSound = FmManager.getRawAudios();
if (Build.VERSION.SDK_INT = Build.VERSION_CODES.LOLLIPOP) {
if (null == spBuilder) {
spBuilder = new SoundPool.Builder();
AudioAttributes.Builder builder = new AudioAttributes.Builder();
builder.setLegacyStreamType(AudioManager.STREAM_MUSIC);
spBuilder.setAudioAttributes(builder.build());
spBuilder.setMaxStreams(10);
}
if (null == soundPool) {
soundPool = spBuilder.build();
}
} else {
if (null == soundPool) {
soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 10); //最多播放10个音效,格式为Steam_music,音质为10
}
}
soundPool.setOnLoadCompleteListener(this);
if (null == fmArray) {
fmArray = new SparseIntArray();
}
if (null == streamArray) {
streamArray = new SparseIntArray();
}
for (int i = 0; i < fmSound.length; i++) {
fmArray.put(i + 1, soundPool.load(this, fmSound[i], 1)); //将需要播放的资源添加到SoundPool中,并保存返回的StreamID,通过StreamID可以停止某个音效
}
private void playFmByPosition(int resultId) {
if (null == soundPool || resultId < 0 || fmArray == null || fmArray.size() < 0 || streamArray == null)
return;
LogUtils.e(resultId + "------------" + fmArray.size());
if (resultId < fmArray.size()) {
if (!FmPlaying.isPlay(resultId)) {
int fmPlayId = soundPool.play(fmArray.get(resultId + 1), 1, 1, 0, -1, 1);
streamArray.put(resultId, fmPlayId);
FmPlaying.setPlay(resultId, true);
} else {
soundPool.stop(streamArray.get(resultId));
streamArray.removeAt(resultId);
FmPlaying.setPlay(resultId, false);
}
}
}
static class FmPlaying {
private static SparseBooleanArray playArray = new SparseBooleanArray();
public static boolean isPlay(int position) {
return playArray.get(position, false);
}
public static void setPlay(int position, boolean play) {
playArray.put(position, play);
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助。
- 【译】TensorFlow实现Batch Normalization
- 关于Python语言规范你需要知道的一些小tips
- R语言可视化——REmap(路径图)
- python面向对象
- 字符串hash入门
- R语言数据处理——数据合并与追加
- python爬取链家租房之获取房屋页面的详细信息(房名,地址,房价,面积,url)
- 信用卡“坏账”客户分析(二)
- Mac上提升python运算速度-PyPy初体验
- python处理json数据(复杂的json转化成嵌套字典并处理)
- Pointer-network理论及tensorflow实战
- python3 log文件处理获取某天需要的数据
- 实战深度强化学习DQN-理论和实践
- Python 工匠:编写条件分支代码的技巧
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 《深入浅出SQL》问答录(七)
- 《深入浅出SQL》问答录(八)
- Improvise_a_Jazz_Solo_with_an_LSTM_Network_v3a-2
- 《深入浅出SQL》问答录(九)
- 《深入浅出SQL》问答录(十)
- Operations_on_word_vectors_v2a
- LeetCode精选好题(一)
- LeetCode精选好题(二)
- 【leetcode两题选手】算法类题目(7.26)
- MySQL见闻录 -- 入门之旅(一)
- MySQL见闻录 -- 入门之旅(二)
- MySQL见闻录 - 入门之旅(三)
- MySQL见闻录 - 入门之旅(四)
- MySQL见闻录 - 入门之旅(六)(C++操作MySQL)
- Emojify_v2a