🎶

【Android】MediaPlayerで音声を再生する

2024/02/11に公開

Androidでは MediaPlayer API を介して音声を再生することが可能です。
下記の動画のように音声を再生できるアプリを作ってみましょう

https://github.com/entaku0818/AudioMasterAndroid/blob/main/movie/PlayAudio_MediaPlayer.mov

1. AudioPlayerクラスの準備

まず、音声ファイルの再生を管理するAudioPlayerクラスを作成します。このクラスは、MediaPlayerインスタンスの初期化、再生、停止、一時停止を担います。

class AudioPlayer(
    private val context: Context,
    private val resourceId: Int,
    private val mediaPlayerFactory: (Context, Int) -> MediaPlayer = { ctx, resId ->
        MediaPlayer.create(ctx, resId)
    }
) {

    private var mediaPlayer: MediaPlayer? = null

    init {
        prepareMediaPlayer()
    }

    private fun prepareMediaPlayer() {
        mediaPlayer = mediaPlayerFactory(context, resourceId).apply {
            setOnCompletionListener {
                stopAudio()
            }
        }
    }

    fun playAudio() {
        mediaPlayer?.start()
    }

    fun stopAudio() {
        mediaPlayer?.stop()
        mediaPlayer?.release()
        mediaPlayer = null
        prepareMediaPlayer()
    }

    fun pauseAudio() {
        mediaPlayer?.pause()
    }
}

2. ViewModelの作成

AndroidViewModelを継承したAudioPlayerViewModelクラスを作成します。このクラスでは、UIからの操作を受けてAudioPlayerクラスの各メソッドを呼び出します。

package com.example.myapplication

import android.app.Application
import androidx.lifecycle.AndroidViewModel
import com.example.myapplication.model.AudioPlayer

class AudioPlayerViewModel(
    application: Application,
    private val resourceId: Int = R.raw.jinglebells
) : AndroidViewModel(application) {

    private val audioPlayer = AudioPlayer(application, resourceId)

    fun playAudio() {
        audioPlayer.playAudio()
    }

    fun pauseAudio() {
        audioPlayer.pauseAudio()
    }

    fun stopAudio() {
        audioPlayer.stopAudio()
    }

    override fun onCleared() {
        super.onCleared()
        audioPlayer.stopAudio()
    }
}

3. UIの構築

Jetpack Composeを使用してUIを構築します。MainActivity内でAudioPlayerScreenコンポーザブル関数を呼び出し、再生と一時停止のボタンを提供します。


class MainActivity : ComponentActivity() {

    private val viewModel: AudioPlayerViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            AudioPlayerScreen(viewModel)
        }
    }
}

@Composable
fun AudioPlayerScreen(viewModel: AudioPlayerViewModel) {
    Column(modifier = Modifier.padding(PaddingValues(16.dp))) {
        Button(onClick = { viewModel.playAudio() }) {
            Text(text = "Play Audio")
        }
        Button(onClick = { viewModel.pauseAudio()}) {
            Text(text = "Pause Audio")
        }
    }
}

まとめ

この記事では、AndroidでMediaPlayerを使用して音声ファイルを再生する方法を学びました。MediaPlayerの基本的な使用方法をマスターすることで、アプリケーションにメディア体験を提供することができます。

サンプルコードをこちらにおいたのでぜひ参考にしてみてください
https://github.com/entaku0818/AudioMasterAndroid

Discussion