【Android】音声を再生するには

■ はじめに

Android で 音声 を 再生 する方法を学ぶ。

なお、音声ファイルは、以下のサイトから落とせる。
ダウンロードしたwavファイルを以下に置く。
~~~~~
res/raw/***.wav
~~~~~

https://maoudamashii.jokersounds.com/core.cgi
https://soundeffect-lab.info/sound/battle/

■ 音声を再生する方法

* 以下の方法があるらしい。
 => 特徴を理解して使い分ける必要がある

【1】SoundPool
【2】MediaPlayer
【3】AudioTrack
【4】JetPlayer

【1】SoundPool

* 短い音声(e.g. 効果音)を再生する際に適したクラス

https://developer.android.com/reference/kotlin/android/media/SoundPool

【2】MediaPlayer

* 音楽ファイルなどを再生する際に適したクラス

https://developer.android.com/reference/kotlin/android/media/MediaPlayer

【3】AudioTrack

* バイトデータを再生するためのクラス

【4】JetPlayer

* JET ファイルを再生するためのクラス

■ サンプル

例1)SoundPool

手順

1)SoundPoolのインスタンスを生成する
2)load()で音声ファイルを読み込み、サウンドIDを取得する
3)play()に2)のサウンドIDを渡して、再生する
4)release()でSoundPoolのリソースを開放する

MainActivity.kt

import android.content.DialogInterface
import android.media.AudioAttributes
import android.media.SoundPool
import android.os.Build
import android.os.Bundle
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {
    private lateinit var soundPool:SoundPool
    private var soundId = 0

    @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 1)SoundPoolのインスタンスを生成する
        val audioAttributes=
            AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_ALARM)
                .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
                .build()
        soundPool =
            SoundPool.Builder()
                .setAudioAttributes(audioAttributes)
                .setMaxStreams(2)
                .build()
        // 2)load()で音声ファイルを読み込み、サウンドIDを取得する
        soundId = soundPool.load(
            this,
            R.raw.one,
            1)
        // 複数ロード時
        //soundTwo = soundPool.load(
        //    this,
        //    R.raw.two,
        //    1)

        button.setOnClickListener {
            // 3)play()に2)のサウンドIDを渡して、再生する
            soundPool.play(
                soundIdOne,
                1.0f,
                1.0f,
                0,
                0,
                1.0f)
        }
    }
    override fun onPause() {
        super.onPause()
        // 4)release()でSoundPoolのリソースを開放する
        soundPool.release()
    }
}

補足:LOLLIPOP未満の対応
https://www.letitride.jp/entry/2019/05/29/170157

@Suppress("DEPRECATION")
private fun initializeSounds() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        val audioAttributes = AudioAttributes.Builder()
            .setUsage(AudioAttributes.USAGE_ALARM)
            .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
            .build()
        this.soundPool =
            SoundPool.Builder()
                .setAudioAttributes(audioAttributes)
                .setMaxStreams(1)
                .build()
    } else {
        this.soundPool = SoundPool(
            1, AudioManager.STREAM_ALARM, 0)
    }

    this.soundId = this.soundPool.load(
        this,
        R.raw.two,
        1
    )
}

例2:MediaPlayer

手順

1)create()を使って、MediaPlayerインスタンスを生成する
2)start()を使って、音声開始する

MainActivity.kt

import android.content.DialogInterface
import android.media.MediaPlayer
import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity(), SimpleDialogFragment.OnClickListener {
    private lateinit var mediaPlayer : MediaPlayer

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 1)create()を使って、MediaPlayerインスタンスを生成する
        mediaPlayer = MediaPlayer.create(
            this,
            R.raw.sample_sound)

        button.setOnClickListener {
            // 2)start()を使って、音声開始する
            mediaPlayer.start()
        }
    }
}

参考文献

https://dev.classmethod.jp/articles/android-tips-48-soundpool-mediaplayer/
https://akira-watson.com/android/kotlin/soundpool-play.html
https://little-strange.hatenablog.com/entry/2019/11/10/225648
https://www.atmarkit.co.jp/ait/articles/1203/28/news128.html

関連記事

 画像を表示するには
https://dk521123.hatenablog.com/entry/2013/09/28/013815
動画を再生するには
https://dk521123.hatenablog.com/entry/2013/09/30/002134