티스토리 뷰
오디오나 동영상을 재생할 때 미디어 플레이어가 사용되는 것처럼 오디오 녹음이나 동영상 녹화를 위해서는 MediaRecorder를 사용한다.
오디오의 녹음은 보통 아래와 같은 순서로 코드를 작성한다.
- MediaRecorder 객체 생성
- 오디오 입력 및 출력 형식 설정
- 오디오 인코더와 파일 지정
- 녹음 시작
◎MainActivity.java
package com.example.audiorecorder;
import android.content.ContentValues;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import com.yanzhenjie.permission.Action;
import com.yanzhenjie.permission.AndPermission;
import com.yanzhenjie.permission.runtime.Permission;
import java.io.File;
import java.util.List;
public class MainActivity extends AppCompatActivity {
MediaRecorder recorder;
MediaPlayer player;
File file;
String filename;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AndPermission.with(this)
.runtime()
.permission(
Permission.RECORD_AUDIO,
Permission.WRITE_EXTERNAL_STORAGE,
Permission.READ_EXTERNAL_STORAGE)
.onGranted(new Action<List<String>>() {
@Override
public void onAction(List<String> permissions) {
}
})
.start();
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startRecording();
}
});
Button button2 = findViewById(R.id.button2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
stopRecording();
}
});
Button button3 = findViewById(R.id.button3);
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startPlay();
}
});
Button button4 = findViewById(R.id.button4);
button4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
stopPlay();
}
});
file = getOutputFile();
if (file != null) {
filename = file.getAbsolutePath();
}
}
public File getOutputFile() {
File mediaFile = null;
try {
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), "MyApp");
if (!mediaStorageDir.exists()){
if (!mediaStorageDir.mkdirs()){
Log.d("MyCameraApp", "failed to create directory");
return null;
}
}
mediaFile = new File(mediaStorageDir.getPath() + File.separator + "recorded.mp4");
} catch(Exception e) {
e.printStackTrace();
}
return mediaFile;
}
public void startRecording() {
if (recorder == null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
recorder = new MediaRecorder(this);
} else {
recorder = new MediaRecorder();
}
}
// MediaRecorder 설정하기
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
recorder.setOutputFile(filename);
try {
// MediaRecorder 시작
recorder.prepare();
recorder.start();
} catch (Exception e) {
e.printStackTrace();
}
}
public void stopRecording() {
if (recorder == null) {
return;
}
// MediaRecorder Stop
recorder.stop();
// MediaRecorder 리소스 해제제
recorder.release();
recorder = null;
// 녹음 파일을 미디어 앨범에 등록하기 위해 미디어 앨범의 내용 제공자를 이용하여 만들어진 녹음 파일의 정보를 등록
ContentValues values = new ContentValues(10);
values.put(MediaStore.MediaColumns.TITLE, "Recorded");
values.put(MediaStore.Audio.Media.ALBUM, "Audio Album");
values.put(MediaStore.Audio.Media.ARTIST, "Choonham");
values.put(MediaStore.Audio.Media.DISPLAY_NAME, "Recorded Audio");
values.put(MediaStore.Audio.Media.IS_RINGTONE, 1);
values.put(MediaStore.Audio.Media.IS_MUSIC, 1);
values.put(MediaStore.MediaColumns.DATE_ADDED,
System.currentTimeMillis()/1000);
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp4");
values.put(MediaStore.Audio.Media.DATA, filename);
Uri audioUri = getContentResolver().insert(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, values);
if (audioUri == null) {
Log.d("SampleAudioRecorder", "Audio insert failed.");
return;
}
}
public void startPlay() {
killMediaPlayer();
try {
player = new MediaPlayer();
player.setDataSource(filename);
player.prepare();
player.start();
} catch(Exception e) {
e.printStackTrace();
}
}
public void stopPlay() {
if (player != null) {
player.stop();
}
}
private void killMediaPlayer() {
if (player != null) {
try {
player.release();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
반응형
'Mobile > Android' 카테고리의 다른 글
[Android] 위치 1: GPS로 단말 위치 확인하기 (0) | 2022.04.22 |
---|---|
[Android] Multi Media 7: Camera2 API 를 사용한 동영상 저장 (0) | 2022.04.22 |
[Android] Multi Media 5: Camera2 API (0) | 2022.04.20 |
[Android] Multi Media 4: 동영상 재생하기 (0) | 2022.04.20 |
[Android] Multi Media 3: 오디오 재생 (0) | 2022.04.20 |
Comments
최근에 올라온 글
최근에 달린 댓글
TAG
- Async
- react-native
- 정보보안기사 #실기 #정리
- redux-thunk
- 인천 구월동 맛집
- 파니노구스토
- 맛집
- 이탈리안 레스토랑
- 인천 구월동 이탈리안 맛집
- javascript
- react
- AsyncStorage
- await
- redux
- Promise
- Total
- Today
- Yesterday