再生・停止

Kotlin

res/values/strings.xml

<resources>
    <string name="app_name">myapp</string>
    <string name="bt_play">PLAY</string>
    <string name="bt_pause">PAUSE</string>
</resources>

res/raw/sample_music.mp3

DLしたsample_music.mp3を格納します。

音声ファイル名には小文字とアンダーバーしか使えません。

activity_main.xml

<Button
    android:id="@+id/btPlay"
    android:text="再生" />

MainActivity.kt

package com.example.app5

import android.media.MediaPlayer
import android.net.Uri
import android.os.Bundle
import android.view.View
import android.widget.Button
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat

class MainActivity : AppCompatActivity() {
    private var _player: MediaPlayer? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContentView(R.layout.activity_main)
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
            insets
        }

        _player = MediaPlayer()
        val mediaFileUri = Uri.parse("android.resource://${packageName}/${R.raw.sample_music}")
        _player?.apply {
            setOnPreparedListener(PlayerPreparedListener())
            setOnCompletionListener(PlayerCompletionListener())
            setDataSource(this@MainActivity, mediaFileUri)
            prepareAsync()
        }

        val btPlay = findViewById<Button>(R.id.btPlay)
        btPlay.setOnClickListener {
            onPlayButtonClick(it)
        }
    }

    // 準備完了リスナ
    private inner class PlayerPreparedListener: MediaPlayer.OnPreparedListener {
        override fun onPrepared(mp: MediaPlayer) {
            val btPlay = findViewById<Button>(R.id.btPlay)
            btPlay.isEnabled = true
        }
    }

    // 再生終了リスナ
    private inner class PlayerCompletionListener : MediaPlayer.OnCompletionListener {
        override fun onCompletion(mp: MediaPlayer) {
            val btPlay = findViewById<Button>(R.id.btPlay)
            btPlay.text = "再生"
        }
    }

    // 再生ボタンをタップしたときの処理
    fun onPlayButtonClick(view: View) {
        _player?.let {
            val btPlay = findViewById<Button>(R.id.btPlay)
            if(it.isPlaying) {
                it.pause()
                btPlay.text = "再生"
            } else {
                it.start()
                btPlay.text = "一時停止"
            }
        }
    }


    //
    override fun onStop() {
        _player?.let {
            if(it.isPlaying) {
                it.stop()
            }
            it.release()
        }
        _player = null
        super.onStop()
    }
}
BACK