一、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)。
三、完整代码
- 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);
}
}
- 布局文件
<?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>
- 音频资源存放位置
- 运行效果
—————————————————End——————————————————
四、补充
- 在Fragment中上下文传递使用👇
//getActivity().getApplicationContext()
pool.load(getActivity().getApplicationContext(), R.raw.audio_voz_mujer_1, 1);
类似于拨号盘语音播放的应用场景,为了避免频繁的播放导致音频失效的情况,可以将音频上传这一步骤放在打开apk时上传——load()放在onCreate()方法中,每次按下按键时仅播放音频。一个活动的生命周期仅上传一次音频文件替代每次发生按钮点击事件上传一次音频文件,大大改善程序运行效率。