【Android】MediaRecorderでオーディオ録音機能を実装する
Androidでオーディオ録音機能を実装する
Android アプリケーションにオーディオ録音機能を追加する方法を学びましょう。ここではMediaRecorder
とMediaPlayer
クラスを使用して、ユーザーがオーディオを録音、停止、再生できるシンプルなアプリケーションを作成します。
基本設定
まず、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
クラスで実装されています。このクラスでは、MediaRecorder
とMediaPlayer
のインスタンスを使用しています。
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