안드로이드에서는 오디오와 비디오를 재생하고 녹음하기 위한 다양한 API를 제공합니다. 여기서는 주로 MediaPlayer
와 MediaRecorder
를 사용하는 방법을 설명하고, 간단한 예제를 포함합니다.
오디오 재생
오디오를 재생하기 위해 안드로이드의 MediaPlayer
클래스를 사용할 수 있습니다. MediaPlayer
는 로컬 파일, 스트리밍 오디오 등 다양한 소스에서 오디오를 재생할 수 있습니다.
MediaPlayer를 사용한 오디오 재생 예제
import android.media.MediaPlayer; import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { private MediaPlayer mediaPlayer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 로컬 오디오 파일 재생 mediaPlayer = MediaPlayer.create(this, R.raw.sample_audio); // res/raw/sample_audio.mp3 파일 mediaPlayer.start(); // 재생 시작 } @Override protected void onDestroy() { super.onDestroy(); if (mediaPlayer != null) { mediaPlayer.release(); // MediaPlayer 리소스 해제 mediaPlayer = null; } } }
오디오 녹음
오디오를 녹음하기 위해 안드로이드의 MediaRecorder
클래스를 사용할 수 있습니다. MediaRecorder
는 오디오 입력을 받아 파일로 저장할 수 있습니다.
MediaRecorder를 사용한 오디오 녹음 예제
import android.Manifest; import android.content.pm.PackageManager; 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 androidx.core.content.ContextCompat; import java.io.IOException; public class MainActivity extends AppCompatActivity { private static final int REQUEST_RECORD_AUDIO_PERMISSION = 200; private MediaRecorder recorder = null; private boolean isRecording = false; private String fileName = null; private Button recordButton; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.activity_main); // 퍼미션 요청 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO}, REQUEST_RECORD_AUDIO_PERMISSION); fileName = getExternalFilesDir(Environment.DIRECTORY_MUSIC).getAbsolutePath(); fileName += "/audiorecordtest.3gp"; recordButton = findViewById(R.id.recordButton); recordButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (isRecording) { stopRecording(); } else { startRecording(); } isRecording = !isRecording; recordButton.setText(isRecording ? "Stop Recording" : "Start Recording"); } }); } private void startRecording() { recorder = new MediaRecorder(); recorder.setAudioSource(MediaRecorder.AudioSource.MIC); recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); recorder.setOutputFile(fileName); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); try { recorder.prepare(); } catch (IOException e) { e.printStackTrace(); } recorder.start(); } private void stopRecording() { recorder.stop(); recorder.release(); recorder = null; } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_RECORD_AUDIO_PERMISSION) { if (grantResults.length == 0 || grantResults[0] != PackageManager.PERMISSION_GRANTED) { // 권한 거부 시 앱 종료 finish(); } } } }
비디오 재생
비디오를 재생하기 위해 안드로이드의 VideoView
위젯을 사용할 수 있습니다. VideoView
는 비디오 파일을 쉽게 재생할 수 있는 UI 컴포넌트입니다.
VideoView를 사용한 비디오 재생 예제
XML 레이아웃 파일 (res/layout/activity_main.xml
):
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <VideoView android:id="@+id/videoView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerInParent="true"/> </RelativeLayout>
Java 코드 (MainActivity.java
):
import android.net.Uri; import android.os.Bundle; import android.widget.MediaController; import android.widget.VideoView; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { private VideoView videoView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); videoView = findViewById(R.id.videoView); // 로컬 비디오 파일 재생 Uri uri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.sample_video); // res/raw/sample_video.mp4 파일 videoView.setVideoURI(uri); // 미디어 컨트롤러 추가 (재생, 일시 정지 등) MediaController mediaController = new MediaController(this); videoView.setMediaController(mediaController); mediaController.setAnchorView(videoView); videoView.start(); // 비디오 재생 시작 } }
비디오 녹음
비디오를 녹음하기 위해 MediaRecorder
를 사용할 수 있습니다. 비디오 녹음은 오디오와 비디오 모두를 캡처합니다.
MediaRecorder를 사용한 비디오 녹음 예제
XML 레이아웃 파일 (res/layout/activity_main.xml
):
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:id="@+id/camera_preview" android:layout_width="match_parent" android:layout_height="match_parent" /> <Button android:id="@+id/recordButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Start Recording" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" /> </RelativeLayout>
Java 코드 (MainActivity.java
):
import android.Manifest; import android.content.pm.PackageManager; import android.hardware.Camera; import android.media.MediaRecorder; import android.os.Bundle; import android.os.Environment; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.widget.Button; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import java.io.File; import java.io.IOException; public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback { private static final int REQUEST_RECORD_AUDIO_PERMISSION = 200; private MediaRecorder mediaRecorder; private Camera camera; private SurfaceView surfaceView; private SurfaceHolder surfaceHolder; private boolean isRecording = false; private Button recordButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 퍼미션 요청 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO, Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_RECORD_AUDIO_PERMISSION); surfaceView = findViewById(R.id.camera_preview); surfaceHolder = surfaceView.getHolder(); surfaceHolder.addCallback(this); recordButton = findViewById(R.id.recordButton); recordButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (isRecording) { stopRecording(); } else { startRecording(); } isRecording = !isRecording; recordButton.setText(isRecording ? "Stop Recording" : "Start Recording"); } }); } private void startRecording() { camera = Camera.open(); camera.unlock(); mediaRecorder = new MediaRecorder(); mediaRecorder.setCamera(camera); mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mediaRecorder.setOutputFile(getOutputMediaFile().toString()); mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface()); try { mediaRecorder.prepare(); } catch (IOException e) { e.printStackTrace(); } mediaRecorder.start(); } private void stopRecording() { mediaRecorder.stop(); mediaRecorder.release(); camera.release(); } private static File getOutputMediaFile() { File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES), "MyCameraApp"); if (!mediaStorageDir.exists()) { if (!mediaStorageDir.mkdirs()) { return null; } } String timeStamp = new java.text.SimpleDateFormat("yyyyMMdd_HHmmss").format(new java.util.Date()); return new File(mediaStorageDir.getPath() + File.separator + "VID_" + timeStamp + ".mp4"); } @Override public void surfaceCreated(SurfaceHolder holder) { } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_RECORD_AUDIO_PERMISSION) { if (grantResults.length == 0 || grantResults[0] != PackageManager.PERMISSION_GRANTED) { // 권한 거부 시 앱 종료 finish(); } } } }
이 예제에서는 카메라와 마이크를 사용하여 비디오를 녹화하고 저장합니다.
위의 예제들을 통해 안드로이드에서 오디오 및 비디오를 재생하고 녹음하는 기본적인 방법을 알 수 있습니다. 이를 통해 다양한 멀티미디어 기능을 앱에 구현할 수 있습니다.