使用SoundPool播放音频Demo

文章介绍了Android中SoundPool类的使用,适用于播放小型音频文件,如语音播报和铃声。详细步骤包括SoundPool的实例化、音频加载和播放方法,并提供了一个简单的Java代码示例,展示了如何在按钮点击事件中播放音频。此外,还提到在Fragment中传递上下文以及优化音频加载策略以提高程序效率。
摘要由CSDN通过智能技术生成

一、SoundPool的应用场景

SoundPool适合用来播放小音频文件,例如拨号盘的语音播报、消息通知铃声等。资源文件一般要小于100KB。

二、步骤

1. 实例化

new SoundPool(int maxStreams, int streamType, int srcQuality);

maxStreams:SoundPool对象的最大同时流数。
streamType:在AudioManager中描述的音频流类型,一般使用AudioManager.STREAM_MUSIC。
srcQuality:采样率转换器质量

2.上传音频

load(Context context, int resId, int priority);//上下文, 资源id, 优先级(为了更好的兼容,一般使用1)

3.播放音频

play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)

soundID:load()函数返回的soundID。
leftVolume:左声道的音量控制, 0.0 到 1.0。
rightVolume:右声道的音量控制, 0.0 到 1.0。
priority:流的优先级(0 =最低优先级)。
loop:循环模式(0 =不循环,-1 =永远循环)。
rate:播放速率(1.0 =正常播放,范围0.5 ~ 2.0)。

三、完整代码

  1. java文件
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button bt1;
    private Button bt2;
    private Button bt3;

    private   SoundPool             pool;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
        //实例化
        pool =  new SoundPool(3, AudioManager.STREAM_MUSIC,1);
        loadRes();
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.bt_one:
            	//play()的第一个参数是soundID,通过它来识别调用相对应的音频资源
                pool.play(1,1,1,1,0,1f);
                break;
            case R.id.bt_two:
                pool.play(2,1,1,1,0,1f);
                break;
            case R.id.bt_three:
                pool.play(3,1,1,1,0,1f);
                break;
            default:
                break;
        }
    }

    private void init(){
        bt1 = findViewById(R.id.bt_one);
        bt2 = findViewById(R.id.bt_two);
        bt3 = findViewById(R.id.bt_three);

        bt1.setOnClickListener(this);
        bt2.setOnClickListener(this);
        bt3.setOnClickListener(this);
    }

    //上传音频,load()方法会返回一个soundID
    private void loadRes(){
        pool.load(MainActivity.this,R.raw.audio_man_voice_1,1);
        pool.load(MainActivity.this,R.raw.audio_man_voice_2,1);
        pool.load(MainActivity.this,R.raw.audio_man_voice_3,1);
    }
}
  1. 布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/text_value" />
    <Button
        android:id="@+id/bt_one"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="1"/>
    <Button
        android:id="@+id/bt_two"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="2"/>
    <Button
        android:id="@+id/bt_three"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="3"/>
</LinearLayout>
  1. 音频资源存放位置
  2. 运行效果
    在这里插入图片描述
    —————————————————End——————————————————

四、补充

  1. 在Fragment中上下文传递使用👇
	  //getActivity().getApplicationContext()
	  pool.load(getActivity().getApplicationContext(), R.raw.audio_voz_mujer_1, 1);
  1. 类似于拨号盘语音播放的应用场景,为了避免频繁的播放导致音频失效的情况,可以将音频上传这一步骤放在打开apk时上传——load()放在onCreate()方法中,每次按下按键时仅播放音频。一个活动的生命周期仅上传一次音频文件替代每次发生按钮点击事件上传一次音频文件,大大改善程序运行效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值