Androidで音を再生してみる
今回はSoundPoolクラスを使って音を再生してみたいと思います。再生する音楽ファイルはogg形式でassetsフォルダ配下に格納されているものを使用するので、前回、投稿のAssetManagerも使用します。
やりたいこと
実装の要点を下記にまとめます
1. 音量ボタンが音楽のStreamを制御するように紐付ける
setVolumeControlStream(AudioManager.STREAM_MUSIC);
2. SoundPoolオブジェクトを取得
private static final int SOUND_NUM = 10; private SoundPool mSp; mSp = new SoundPool(SOUND_NUM, AudioManager.STREAM_MUSIC, 0);
3. AssetManagerを取得し、AssetFileDescriptorを取得
private static final String AUDIO = "metal.ogg"; AssetManager am = getAssets(); try { AssetFileDescriptor fd = am.openFd(AUDIO); } catch (IOException e) { e.printStackTrace(); }
4. FileDescripterを使って、使用するサウンドをloadしIDを取得する
private int mId = -1; mId = mSp.load(fd, 1);
5. サウンドのIDを指定して再生
mSp.play(mId, 1, 1, 0, 0, 1);
6. 使わなくなったサウンドをunloadして、SoundPoolはreleaseする
mSp.unload(mId); mSp.release();
では実装です
package com.android.practice; import java.io.IOException; import android.app.Activity; import android.content.res.AssetFileDescriptor; import android.content.res.AssetManager; import android.media.AudioManager; import android.media.SoundPool; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.widget.Button; import android.widget.TextView; public class SoundPoolTest extends Activity implements OnClickListener { private static final String TAG = SoundPoolTest.class.getSimpleName(); private static final int SOUND_NUM = 10; private static final String AUDIO = "metal.ogg"; private SoundPool mSp; private int mId = -1; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button btn = (Button)findViewById(R.id.button); TextView textView = (TextView)findViewById(R.id.text); btn.setOnClickListener(this); //音量ボタンが音楽のStreamを制御するように紐付ける setVolumeControlStream(AudioManager.STREAM_MUSIC); //SoundPoolオブジェクトを取得 mSp = new SoundPool(SOUND_NUM, AudioManager.STREAM_MUSIC, 0); //AssetManagerを取得 AssetManager am = getAssets(); try { //AssetFileDescriptorを取得 AssetFileDescriptor fd = am.openFd(AUDIO); //FileDescripterを使って、使用するサウンドをloadしIDを取得する mId = mSp.load(fd, 1); } catch (IOException e) { e.printStackTrace(); textView.setText(R.string.error); } } @Override protected void onDestroy() { super.onDestroy(); if(mSp != null){ if(mId != -1){ //使わなくなったサウンドをunload mSp.unload(mId); } //SoundPoolが使用しているリソースを全て解放 mSp.release(); } } @Override public void onClick(View v) { if(mId != -1){ //サウンドのIDを指定して再生 mSp.play(mId, 1, 1, 0, 0, 1); } } }
と、こんな感じです。ゲームで使う効果音などはSoundPoolを使ってメモリーにloadして、音を再生するという事です。
HashTag #Java, #Android, #SoundPool, #AssetManager, #AssetFileDescriptor, #AudioManager