SoundPool可以用来播放一些较短的音效,如一些信息提醒之类的
先来说下会用到的参数
SoundPool(int maxStreams, int streamType, int srcQuality)的参数
maxStreams:指定支持多少个声音,SoundPool对象中允许同时存在的最大流的数量
streamType:声音类型,流类型可以分为STREAM_VOICE_CALL, STREAM_SYSTEM, STREAM_RING,STREAM_MUSIC 和 STREAM_ALARM四种类型。在AudioManager
定义
srcQuality:声音品质(采样率变换质量),当前无效果,用0作为默认
SoundPool在API 21(Android 5.0)之后就过时了,用SoundPool.Builder
play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)
soundID:Load()返回的声音ID号
leftVolume:左声道音量设置
rightVolume:右声道音量设置
priority:播放声音的优先级,数值越高,优先级越大。
loop:是否循环:-1表示无限循环,0表示不循环,其他值表示要重复播放的次数
rate:播放速率:播放速率的取值范围是0.5至2.0,1.0为原始播放速率,2.0的播放速率为原始速率的两位。0.5的播放速率为原始速率的一半。
release()方法释放所有SoundPool对象占据的内存和资源,也可以指定要释放的ID
需要编辑的文件如下
activity_main.xml
[html] view plain copy
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:id="@+id/rawPlay"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="raw" />
<Button
android:id="@+id/assetsPlay"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="assets" />
<Button
android:id="@+id/btn_release"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="释放SoundPool" />
</LinearLayout>
MainActivity.java
[java] view plain copy
package cn.wuxiaocheng.soundpool;
import android.content.res.AssetManager;
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import java.util.HashMap;
public class MainActivity extends AppCompatActivity implements OnClickListener {
private Button btn_play1;
private Button btn_play2;
private Button btn_release;
private AssetManager aManager;
private SoundPool mSoundPool = null;
private HashMap<Integer, Integer> soundID = new HashMap<Integer, Integer>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
aManager = getAssets();
try {
initSP();
} catch (Exception e) {
e.printStackTrace();
}
bindViews();
}
private void bindViews() {
btn_play1 = (Button) findViewById(R.id.rawPlay);
btn_play2 = (Button) findViewById(R.id.assetsPlay);
btn_release = (Button) findViewById(R.id.btn_release);
btn_play1.setOnClickListener(this);
btn_play2.setOnClickListener(this);
btn_release.setOnClickListener(this);
}
private void initSP() throws Exception {
//当前系统的SDK版本大于等于21(Android 5.0)时
if (Build.VERSION.SDK_INT >= 21) {
SoundPool.Builder builder = new SoundPool.Builder();
//传入音频数量
builder.setMaxStreams(2);
//AudioAttributes是一个封装音频各种属性的方法
AudioAttributes.Builder attrBuilder = new AudioAttributes.Builder();
//设置音频流的合适的属性
attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC);
//加载一个AudioAttributes
builder.setAudioAttributes(attrBuilder.build());
mSoundPool = builder.build();
}
//当系统的SDK版本小于21时
else {//设置最多可容纳2个音频流,音频的品质为5
mSoundPool = new SoundPool(2, AudioManager.STREAM_SYSTEM, 5);
}
soundID.put(1, mSoundPool.load(this, R.raw.raw, 1));
soundID.put(2, mSoundPool.load(getAssets().openFd("assets.mp3"), 1)); //需要捕获IO异常
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.rawPlay:
mSoundPool.play(soundID.get(1), 1, 1, 0, 0, 1);
break;
case R.id.assetsPlay:
mSoundPool.play(soundID.get(2), 1, 1, 0, 0, 1);
break;
case R.id.btn_release:
//回收SoundPool资源
mSoundPool.release();
break;
}
}
}