Android : SoundPoolやMediaActionSoundで効果音を利用する

Androidでの効果音の実装方法に個人的にいろいろUpdateがあったのでまとめておきたいと思います。

SoundPool.Builderを利用する

Androidで効果音をつけるときに利用するのがSoundPoolですが、API 21からSoundPoolインスタンスの生成方法が変わったようです。

Android Developerでは、

This constructor was deprecated in API level 21. use SoundPool.Builder instead to create and configure a SoundPool instance

ということで、SoundPool.Builderの利用を推奨されています。これまでのコンストラクタはdeprecatedになります。

SoundPool.Builder | Android Developers

SoundPool.Builderを利用したコード例です。

mSoundPool = new SoundPool.Builder()
        .setAudioAttributes(new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_GAME)
                .build())
        .setMaxStreams(2)
        .build();

MaxStreamなどは同様ですが、STREAMの指定がなくなって、かわりにAudioAttributesの指定が必要になります。 通常はデフォルトでよさそうですが、例えばゲーム利用などの場合はUSAGE_GAMEの利用が推奨されています。

まだ個人的に不要なので、あまり細かいところまで見ていないですが、STREAM含め細かいSound周りの設定をラップしているのだと想定されます。

API 21以上のアプリを作成する場合にはこちらを利用することになりそうです。

MediaActionSoundでOSに含まれているサウンドリソースを利用する

あまりユースケースはないのかもしれませんが、Android 4.1 (API 16)からMediaActionSoundを通じてカメラ周りの音源を任意に利用することができるようです。

MediaActionSound | Android Developers

日本語での解説はTechBoosterにもありましたので、こちらも参考になります。

techbooster.org

例として、シャッター音を利用するコードを掲載しておきます。

まずonCreateあたりでリソースをロードします。

mShutterSound = new MediaActionSound();
mShutterSound.load(MediaActionSound.SHUTTER_CLICK);

解放するコードも忘れずに記述します。

public void onDestroy() {
    if (mShutterSound != null) {
        mShutterSound.release();
        mShutterSound = null;
    }
}

再生するときは、下記のようにID指定で呼び出します。 SoundPoolと違って、IDは固定なのでロードしておけば提供されている定数で利用できます。

mShutterSound.play(MediaActionSound.SHUTTER_CLICK);

以上MediaPlayerとは別に、SE的な音源利用の方法について最近気づいた内容のまとめでした。