🎶

【Android】MediaRecorderでオーディオ録音機能を実装する

2024/02/11に公開

Androidでオーディオ録音機能を実装する

Android アプリケーションにオーディオ録音機能を追加する方法を学びましょう。ここではMediaRecorderMediaPlayerクラスを使用して、ユーザーがオーディオを録音、停止、再生できるシンプルなアプリケーションを作成します。

基本設定

まず、AndroidManifest.xmlファイルにオーディオ録音のためのパーミッションを追加する必要があります。

<uses-permission android:name="android.permission.RECORD_AUDIO"/>

Activity の設定

class AudioRecorderActivity : ComponentActivity() {

    private val requestPermissionLauncher = registerForActivityResult(
        ActivityResultContracts.RequestPermission()
    ) { isGranted: Boolean ->
        if (!isGranted) {
            // Handle permission denial
        }
    }

    private val viewModel: AudioRecorderViewModel by viewModels()


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        requestPermissions()
        setContent {
            AudioRecorderUI(viewModel = viewModel)
        }
    }

    private fun requestPermissions() {
        requestPermissionLauncher.launch(Manifest.permission.RECORD_AUDIO)
    }

    @Composable
    fun AudioRecorderUI(viewModel: AudioRecorderViewModel) {
        Column(modifier = Modifier.padding(PaddingValues(16.dp))) {
            Button(onClick = {
                viewModel.startRecording()
            }) {
                Text("Start Recording")
            }
            Button(onClick = { viewModel.stopRecording() }) {
                Text("Stop Recording")
            }
            Button(onClick = {
                viewModel.playRecordedFile()
            }) {
                Text("Play Recording")
            }
        }
    }
}

パーミッションのリクエスト

AudioRecorderActivityクラスでは、ユーザーから録音パーミッションをリクエストします。ActivityResultContracts.RequestPermissionを使用して、パーミッションのリクエストと結果の処理を行います。

UI コンポーネントの設定

Jetpack Compose を使用して UI を構築します。AudioRecorderUIコンポーザブル関数では、Columnを使って「録音開始」、「録音停止」、「録音再生」の各ボタンを縦に配置します。各ボタンには、viewModelを介して操作を行うためのクリックリスナーが設定されています。

ViewModel の設定

AudioRecorderViewModelクラスは、録音の開始、停止、再生を管理します。このクラスはAndroidViewModelを継承しており、アプリケーションコンテキストを利用してファイルパスを設定しています。

class AudioRecorderViewModel(application: Application) : AndroidViewModel(application) {

    // Applicationインスタンスを使用して出力ファイルのパスを設定
    private val outputFile = application.filesDir.absolutePath + File.separator + "recorded_audio.3gp"

    // AudioRecorderのインスタンスを初期化
    private val audioRecorder = AudioRecorder(
        outputFile = outputFile
    )

    // 録音を開始する
    fun startRecording() {
        audioRecorder.startRecording()
    }

    // 録音を停止する
    fun stopRecording() {
        audioRecorder.stopRecording()
    }

    // 録音されたファイルを再生する
    fun playRecordedFile() {
        audioRecorder.playRecordedFile()
    }

    override fun onCleared() {
        super.onCleared()
        audioRecorder.stopRecording()

    }
}

AudioRecorder クラス

実際の録音と再生の機能はAudioRecorderクラスで実装されています。このクラスでは、MediaRecorderMediaPlayerのインスタンスを使用しています。

class AudioRecorder(private val outputFile: String) {

    private var mediaRecorder: MediaRecorder? = null
    private var mediaPlayer: MediaPlayer? = null
    private var isRecording = false

    fun startRecording() {
        if (isRecording) return

        // MediaRecorderのインスタンスを直接生成
        mediaRecorder = MediaRecorder().apply {
            setAudioSource(MediaRecorder.AudioSource.MIC)
            setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP)
            setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB)
            setOutputFile(outputFile)

            try {
                prepare()
            } catch (e: IOException) {
                e.printStackTrace()
            }

            start()
            isRecording = true
        }
    }

    fun stopRecording() {
        if (!isRecording) return

        mediaRecorder?.apply {
            stop()
            release()
        }
        mediaRecorder = null
        isRecording = false
    }

    fun playRecordedFile() {
        if (mediaPlayer?.isPlaying == true) {
            mediaPlayer?.stop()
            mediaPlayer?.release()
        }

        mediaPlayer = MediaPlayer().apply {
            try {
                setDataSource(outputFile)
                prepare()
                start()
            } catch (e: IOException) {
                e.printStackTrace()
            }
        }
    }
}

録音の開始

startRecordingメソッドでは、新しいMediaRecorderインスタンスを作成し、設定を行った後、録音を開始します。既に録音中の場合は、このメソッドは何もしません。

録音の停止

stopRecordingメソッドでは、録音を停止し、MediaRecorderインスタンスを解放します。録音していない場合は、このメソッドは何もしません。

録音ファイルの再生

playRecordedFileメソッドでは、録音されたオーディオファイルを再生します。再生中には、再生を停止し、MediaPlayerインスタンスを解放した後、新たに設定して再生を開始します。

Discussion