본문 바로가기

안드로이드 Android

[모바일프로그래밍] 9-4 오디오 녹음

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="78dp"
        android:layout_marginTop="66dp"
        android:text="녹음 시작"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="84dp"
        android:layout_marginTop="124dp"
        android:text="재생 시작"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/button" />
</androidx.constraintlayout.widget.ConstraintLayout>

MainActivity.java

package com.example.myapplication;

import android.Manifest;
import android.content.pm.PackageManager;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.Button;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

import java.io.IOException;

public class MainActivity extends AppCompatActivity {

    private static String filename = null;

    Button playbutton, recordbutton;
    private MediaRecorder myrecorder = null;
    private MediaPlayer myplayer = null;

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

        permissionCheck(Manifest.permission.WRITE_EXTERNAL_STORAGE, 100);
        permissionCheck(Manifest.permission.RECORD_AUDIO, 101);

        filename = Environment.getExternalStorageDirectory().getAbsolutePath();
        filename += "/recordtest.3gp";

        playbutton = (Button) findViewById(R.id.button2);
        recordbutton = (Button) findViewById(R.id.button);

        playbutton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (myplayer == null) {
                    myplayer = new MediaPlayer();
                    try {
                        myplayer.setDataSource(filename);
                        myplayer.prepare();
                        myplayer.start();
                    } catch (IOException e) {

                    }
                    playbutton.setText("재생 멈춤");
                } else {
                    myplayer.release();
                    myplayer = null;
                    playbutton.setText("재생 시작");
                }
            }
        });

        recordbutton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (myrecorder == null) {
                    myrecorder = new MediaRecorder();
                    myrecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                    myrecorder.setOutputFile(filename);
                    myrecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                    try {
                        myrecorder.prepare();
                    } catch (IOException e) {

                    }
                    myrecorder.start();
                    recordbutton.setText("녹음 정지");
                }
                else {
                    myrecorder.stop();
                    myrecorder.release();
                    myrecorder = null;
                    recordbutton.setText("녹음 시작");
                }
            }
        });
    }

    public void onPause() {
        super.onPause();
        if (myrecorder != null) {
            myrecorder.release();
            myrecorder = null;
        }
        if (myplayer != null) {
            myplayer.release();
            myplayer = null;
        }
    }

    public void permissionCheck(String permissionId, int requestCode) {
        if (ActivityCompat.checkSelfPermission(this, permissionId) != PackageManager.PERMISSION_GRANTED) {
            if (ActivityCompat.shouldShowRequestPermissionRationale(this, permissionId)) {

            }else {
                ActivityCompat.requestPermissions(this, new String[]{permissionId}, requestCode);
            }
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case 100:
                break;
            case 101:
                break;
        }
    }
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapplication">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>a
</manifest>

처음 앱을 실행하고 녹음 시작 버튼을 누르면 앱이 종료 되는데 앱을 다시 실행하고 권한을 허용해주면 된다. (두 가지 권한을 연달아 허용할 수 있게는 못 하나..?)

그리고 녹음 시작 버튼을 눌러 보면 놀랍게도 앱이 종료된다...

앱을 다시 켜고 재생 시작을 눌러도 아무것도 재생되지 않는다.

Device file explorer를 켜서 확인해 보니 파일이 저장되지도 않았다. (녹음 버튼을 누르면 앱이 종료됐으니 당연한 것)

실제 디바이스에 연결해서 테스트 해 볼 필요가 있을 것 같다.