MediaPlayer虽然也能播放音频,但是它有资源占用量较高,延迟时间较长,不支持多个音频同时播放等缺点,这些缺点决定MediaPlayer在某些场合的使用情况不会很理想,例如在对时间精准度要求相对较高的场景,而SoundPoo一般用来播放密集、急促而又短暂的音效,比如:“滴滴一下 马上出发”

1.添加权限:

<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />

2.动态添加权限

ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CAMERA,Manifest.permission.RECORD_AUDIO},100);

3、创建一个SoundActivity,使用Intent连接MainActivity和SoundActivity

完整代码:

MainActivity布局文件activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><Buttonandroid:onClick="playAudio"android:id="@+id/button3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="播放音效"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/button2" /></androidx.constraintlayout.widget.ConstraintLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);/*** 在 Android 6.0 以上需要动态添加权限*/ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CAMERA,Manifest.permission.RECORD_AUDIO},100);}/*** 播放音效* @param view*/public void playAudio(View view) {//跳转到SoundActivity完成播放音效startActivity(new Intent(this, SoundActivity.class));}
}

SoundActivity.java布局文件activity_sound.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="match_parent" /></androidx.constraintlayout.widget.ConstraintLayout>

适配文件MyAdapter.java

package com.example.mediademo;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> implements View.OnClickListener {//条目数据private final List<SoundActivity.Sound> data;private final Context context;private final RecyclerView recyclerView;private OnItemClickListener listener;//构造方法public MyAdapter(List<SoundActivity.Sound> data, RecyclerView recyclerView, Context context) {this.data = data;this.recyclerView = recyclerView;this.context = context;}@NonNull@Overridepublic MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {//定义TextView显示文本 (a4/a5/a6...)TextView textView = new TextView(context);//设置布局宽高LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);layoutParams.topMargin = 18;layoutParams.leftMargin = 18;textView.setLayoutParams(layoutParams);//文本字体大小textView.setTextSize(20);//设置TextView的点击事件textView.setOnClickListener(this);return new MyViewHolder(textView);}@Overridepublic void onBindViewHolder(@NonNull MyViewHolder holder, int position) {//拿到外面传递进来的data数据,拿到name值赋值给TextView((TextView) holder.itemView).setText(data.get(position).getName());}/*** 条目个数* @return*/@Overridepublic int getItemCount() {return data.size();}/*** 点击事件* @param v*/@Overridepublic void onClick(View v) {if (listener != null) {listener.onItemClick(recyclerView.getChildAdapterPosition(v));}}public void setOnItemClickListener(OnItemClickListener listener) {this.listener = listener;}interface OnItemClickListener {void onItemClick(int position);}class MyViewHolder extends RecyclerView.ViewHolder {public MyViewHolder(@NonNull View itemView) {super(itemView);}}
}

SoundActivity.java

package com.example.mediademo;
import android.media.SoundPool;
import android.os.Bundle;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;public class SoundActivity extends AppCompatActivity implements MyAdapter.OnItemClickListener {//soundPool示例对象private SoundPool soundPool;//封装beanstatic class Sound {String name;int soundId;public Sound(String name, int soundId) {this.name = name;this.soundId = soundId;}public int getSoundId() {return soundId;}public String getName() {return name;}}//条目List<Sound> data;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_sound);//获取RecyclerViewRecyclerView recyclerView = findViewById(R.id.recyclerView);LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);recyclerView.setLayoutManager(linearLayoutManager);//创建soundPool示例对象 setMaxStreams(6)有6个音频soundPool = new SoundPool.Builder().setMaxStreams(6).build();//加载播放音效 给条目塞值(本地文件:res--》raw--》a4.mp3)data = new ArrayList<>();data.add(new Sound("a4", soundPool.load(this, R.raw.a4, 1)));data.add(new Sound("a5", soundPool.load(this, R.raw.a5, 1)));data.add(new Sound("a6", soundPool.load(this, R.raw.a6, 1)));data.add(new Sound("a7", soundPool.load(this, R.raw.a7, 1)));data.add(new Sound("a8", soundPool.load(this, R.raw.a8, 1)));data.add(new Sound("a9", soundPool.load(this, R.raw.a9, 1)));//适配MyAdapter myAdapter = new MyAdapter(data, recyclerView, this);//点击事件myAdapter.setOnItemClickListener(this);//传递给RecyclerViewrecyclerView.setAdapter(myAdapter);}//点击事件(播放)@Overridepublic void onItemClick(int position) {//拿到当前点击的音频Sound sound = data.get(position);//播放(参数一:SoundId | 参数二、三:音量 | 参数四:优先级 | 参数五:循环 0:不循环 1:循环2次 | 参数六:播放速度1.0正常速度)soundPool.play(sound.getSoundId(),1.0f, 1.0f, 1, 0, 1.0f);}//播放完毕(释放)@Overrideprotected void onDestroy() {super.onDestroy();for (Sound datum : data) {//把音效卸载soundPool.unload(datum.getSoundId());}//释放soundPoolsoundPool.release();}
}

音效素材的简单可播放的音效即可(,mp3/.mp4)

建议使用真机测试

Android SoundPool播放音效详细步骤相关推荐

  1. Android MediaPlayer播放视频详细步骤

    MediaPlayer类是媒体框架最重要的组成部分之一,此类的对象能够获取,解码以及播放音频和视频,而且只需极少量设置,它支持多种不同的媒体源,例如: 本地资源 内部Url,例如您可能从内容解析器获取 ...

  2. android 播放固定频率的声音,Android使用SoundPool播放音效

    本文实例为大家分享了Android使用SoundPool播放音效的具体代码,供大家参考,具体内容如下 SoundPool(int maxStreams, int streamType, int src ...

  3. 如何用FFmpeg编写一个简单播放器详细步骤介绍

    如何用FFmpeg编写一个简单播放器详细步骤介绍(转载) FFMPEG是一个很好的库,可以用来创建视频应用或者生成特定的工具.FFMPEG几乎为你把所有的繁重工作都做了,比如解码.编码.复用和解复用. ...

  4. Android连接夜神模拟器详细步骤

    Android连接夜神模拟器详细步骤 做毕设用到了android stdio,好久不用也生疏了,记录一下. (1)打开并运行夜神模拟器, (2)打开命令行窗口,win+R,并输入cmd. (3)找到并 ...

  5. 【Android -- 音效】使用 SoundPool 播放音效

    前言 SoundPool 一般用来 播放密集,急促而又短暂的音效,比如特技音效:Duang~,游戏用得较多,你也可以为你的 APP 添加上这个音效,比如酷狗音乐进去的时候播放"哈喽,酷狗&q ...

  6. soundPool播放音效没声音的解决办法并据此研究如何提高音效声音

    利用soundPool播放简短的音效是非常有用的,优点是它比mediaPlayer占用资源少,还可以同时播放多个音效等但是缺点就是对于音效的大小和持续时间等都有比较高的要求,据传音效的大小不能超过1M ...

  7. android APP集成系统详细步骤及注意事项(amlogic平台)

    此说明用于amlogic平台集成不签名的apk.(如何判断集成的apk需不需要签名.简单来说使用U盘安装后,能正常打开使用的就可以不签名方式集成.) 各平台的文件系统有差异,但整体大同小异.其他平台的 ...

  8. android播放系统音效,Android用SoundPool播放音效

    SoundPool可以用来播放一些较短的音效,如一些信息提醒之类的 先来说下会用到的参数 SoundPool(int maxStreams, int streamType, int srcQualit ...

  9. Android使用SoundPool播放音效实例详解

    使用场景 SoundPool一般用来 播放密集,急促而又短暂的音效,比如特技音效:Duang~,游戏用得较多,你也可以为你的 APP添加上这个音效,比如酷狗音乐进去的时候播放"哈喽,酷狗&q ...

最新文章

  1. 在ASP.NET MVC应用中开发插件框架(中英对照)
  2. mysql 时间戳 三天_MySQL格式化时间戳 统计当日,第二天,第三天,3个工作日以后的数据...
  3. 大规模推荐Deep Retrieval
  4. 编译过程中,termcap.h 文件找不到路径 licli.a终于生成
  5. gps数据处理matlab,基于Matlab的数据处理方法在GPS高程拟合中的应用
  6. 客户说有了PAI-AutoML,一下子可以节约半年开发周期
  7. vue 开发一个按钮组件
  8. Windows Developer Day - Windows AI Platform
  9. java匹配两个字符_·代表任意一个字符,*代表任意一串字符,判断两个字符串是否匹配?...
  10. java poi 导入日期为空
  11. gdb 调试 入手 实例讲解-转
  12. (已解决) centos6.5 yum源 失效 The whole CentOS 6 is dead and shouldn’t be used anywhere at all
  13. 用户需求分析:背后隐藏的门槛
  14. [转载] 七龙珠第一部——第020话 修行的威力
  15. 在线PPT—Sway初级教程
  16. 关于IE中出现的内存不能为written问题的解决方法
  17. 微信公众号自定义菜单修改
  18. python语言入门h_python教程,pythonh学习线路图?
  19. AGM FPGA使用答疑
  20. 电脑非正常关闭导致的自动修复以及U盘的修复命令

热门文章

  1. html5绘制股票图形,股票数据分析(五):绘制股票k线图(js+canvas + Python + json)
  2. 服务器桌面监控,GitHub - 373137461/wallpaper_monitor: 适用于 Wallpaper Engine 等桌面壁纸软件的服务器状态监控软件,使用 PHP 开发...
  3. BZOJ3590【状压DP】
  4. 智能微型RTU通讯设备的特点及应用领域,你都了解吗?
  5. 安川机器人编程指令含义
  6. 写的真好...很多姑娘爱高帅富,其实真正的原因是因为他们有质感,无论物质还是内心
  7. 软件测试——接口测试测试用例设计
  8. Android 平板应用隐藏状态栏和底下的导航栏(navigation bar)
  9. Photoshop CS6 实例之用通道抠取人像
  10. 计算机组成原理包健百度云,计算机组成原理包健版的答案解析.doc