본문 바로가기
프로그래밍/Android

Android 음성 녹음 애플리케이션 만들기

by makepluscode 2023. 12. 2.
반응형

Android에서 MediaStore를 활용한 오디오 녹음 기능 구현하기

Android 애플리케이션에서 MediaStore를 활용하여 오디오 녹음 기능을 구현하는 방법에 대해 알아보겠습니다. 이 포스팅에서는 MediaRecorder를 사용해 오디오를 녹음하고, MediaStore를 통해 녹음 파일을 저장하는 방법을 단계별로 설명합니다.

makepluscode 안드로이드 프로그래밍

1. 기본 설정과 권한

먼저, Android 앱에서 오디오 녹음과 파일 저장을 위한 기본적인 권한 설정이 필요합니다. AndroidManifest.xml에 다음 권한을 추가해야 합니다:

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

2. MediaRecorder 설정

오디오 녹음을 위해 MediaRecorder 클래스를 사용합니다. MediaRecorder는 오디오 소스, 출력 형식, 오디오 인코더 등을 설정할 수 있으며, 파일 저장 경로도 지정합니다.

3. MediaStore를 이용한 파일 저장

Android 10(API 레벨 29) 이상에서는 MediaStore API를 사용하여 파일을 공용 디렉토리에 저장합니다. 이를 통해 사용자의 미디어 라이브러리에 접근하고, 새로운 미디어 파일을 추가할 수 있습니다.

4. MainActivity 클래스

다음은 MainActivity 클래스의 코드입니다. 이 클래스는 UI 초기화, 녹음 시작 및 중지 버튼의 이벤트 처리, 녹음 파일 생성, MediaRecorder 설정 등의 기능을 포함합니다.

package com.example.recordexample;

// 필요한 임포트들...

public class MainActivity extends AppCompatActivity {
    private MediaRecorder mediaRecorder;
    private boolean isRecording = false;
    private Uri fileUri;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initializeRecordingButtons();
    }

    private void initializeRecordingButtons() {
        // 버튼 초기화 및 이벤트 리스너 설정
        // ...
    }

    private void startRecording() {
        // 녹음 시작
        // ...
    }

    private void setupMediaRecorder() throws IOException {
        // MediaRecorder 설정
        // ...
    }

    private Uri createFileUri() throws IOException {
        // MediaStore를 통해 파일 URI 생성
        // ...
    }

    private String createFileName() {
        // 파일 이름 생성
        // ...
    }

    private void stopRecording() {
        // 녹음 중지
        // ...
    }
}

5. 주요코드 설명

안드로이드 앱에서 오디오 녹음을 구현하는 데 중요한 세 가지 메소드는 startRecording, setupMediaRecorder, 그리고 createFileUri입니다. 이들 메소드는 녹음을 시작하고, 미디어 레코더를 설정하며, 저장할 파일의 URI를 생성하는 데 필요합니다. 아래에서 각 메소드의 역할과 작동 방식에 대해 자세히 설명하겠습니다.

startRecording

startRecording 메소드는 실제로 녹음을 시작하는 기능을 합니다. 이 메소드는 녹음을 위한 파일 URI를 생성하고, MediaRecorder를 초기화한 다음, 녹음을 준비하고 시작합니다.

private void startRecording() {
    try {
        fileUri = createFileUri(); // 녹음 파일 URI 생성
        setupMediaRecorder(); // MediaRecorder 설정

        mediaRecorder.prepare(); // 녹음을 준비합니다.
        mediaRecorder.start(); // 녹음을 시작합니다.
        isRecording = true; // 현재 녹음 중임을 나타내는 플래그를 true로 설정합니다.
    } catch (IOException e) {
        e.printStackTrace(); // IOException 발생 시 예외 출력
    }
}
  • createFileUri: 녹음 파일을 저장할 위치의 URI를 생성합니다.
  • setupMediaRecorder: 녹음에 필요한 MediaRecorder의 구성을 설정합니다.
  • mediaRecorder.prepare()mediaRecorder.start(): 녹음을 위한 준비를 하고 실제로 녹음을 시작합니다.

setupMediaRecorder

setupMediaRecorder 메소드는 MediaRecorder 객체의 다양한 설정을 구성합니다. 이 설정에는 오디오 소스, 출력 형식, 오디오 인코더, 출력 파일 경로 등이 포함됩니다.

private void setupMediaRecorder() throws IOException {
    mediaRecorder = new MediaRecorder();
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 마이크를 오디오 소스로 설정
    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); // 출력 형식 설정
    mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); // 오디오 인코더 설정
    mediaRecorder.setOutputFile(getFileDescriptor(fileUri)); // 파일 디스크립터를 이용해 출력 파일 설정
}
  • MediaRecorder.AudioSource.MIC: 마이크를 오디오 입력 소스로 사용합니다.
  • MediaRecorder.OutputFormat.THREE_GPPMediaRecorder.AudioEncoder.AMR_NB: 파일 형식과 인코더를 설정합니다.
  • mediaRecorder.setOutputFile: 녹음 데이터를 저장할 파일 위치를 지정합니다.

createFileUri

createFileUri 메소드는 MediaStore를 사용하여 녹음 파일을 위한 콘텐츠 URI를 생성합니다. 이 URI는 녹음 파일이 실제로 저장될 경로를 나타냅니다.

private Uri createFileUri() throws IOException {
    ContentValues values = new ContentValues();
    values.put(MediaStore.MediaColumns.DISPLAY_NAME, createFileName()); // 파일 이름 설정
    values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/3gpp"); // MIME 타입 설정
    values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_MUSIC + "/RecordExample"); // 저장 경로 설정

    Uri uri = getContentResolver().insert(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, values);
    if (uri == null) {
        throw new IOException("Failed to create new MediaStore record.");
    }
    return uri;
}
  • ContentValues 객체를 사용하여 파일에 대한 메타데이터를 설정합니다.
  • getContentResolver().insert(): 설정된 메타데이터를 바탕으로 MediaStore에 파일 정보를 추가하고, 해당 파일에 대한 URI를 반환합니다.

이 세 메소드는 안드로이드에서 오디오 녹음 기능을 구현하는 데 핵심적인 역할을 합니다. startRecording은 실제

녹음을 시작하는 데 사용되며, setupMediaRecorder는 녹음을 위한 필요한 설정을 제공하고, createFileUri는 녹음 파일을 저장할 위치를 정의합니다.

6. 전체코드

전체 코드는 아래 github 를 참고합니다.

https://github.com/makepluscode/android-mic-recoder-example.git

 

GitHub - makepluscode/android-mic-recoder-example: This Android program records audio using `MediaRecorder`, saves it to the dev

This Android program records audio using `MediaRecorder`, saves it to the device's storage with `MediaStore`, and allows users to start and stop recording through a simple user interface. - Git...

github.com

테스트 화면 (갤럭시 S10 5G Android 12)

위 코드를 실제 하드웨어에서 실행 합니다.

갤럭시 S10 5G (Android 12) 실행화면
갤럭시 S10 5G (Android 12) 실행화면

이 포스팅에서 설명한 것 처럼 MediaRecorderMediaStore를 사용하면, 안드로이드 앱에서 사용자가 쉽게 오디오를 녹음하고 저장할 수 있습니다. 다만, 실제 앱에 이 코드를 통합하기 전에 사용자의 동의를 얻는 권한 요청 처리, 오류 처리, 사용자 인터페이스 개선 등을 고려해야 합니다.

반응형