MediaRecorder์ MediaStore
์ ์ฅ์ ์ก์ธ์ค ์ ์ฑ ๋ณ๊ฒฝ
Android 10 ์ด์์ ํ๊ฒํ ํ๋ ๊ธฐ๊ธฐ๋ถํฐ ์ธ๋ถ ์ ์ฅ์ ๋ฃจํธ๋ ์์ ์ฌ์ฉํ ์๊ฐ ์๊ณ ๋ช ๊ฐ์ง ํ์ฉ๋ ๊ณต๊ฐ๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. ๋, ์ฌ์ฉ ๊ฐ๋ฅํ ์ธ๋ถ ์ ์ฅ์์ ์ก์ธ์คํ ๊ฒฝ์ฐ์ SAF๋ MediaStore๋ฅผ ์ฌ์ฉํ๋๋ก ๊ฐ์ ๋์๋ค.
์ด ์ ์ฅ์ ์ ์ฑ ์ ํ์ฐธ ๋์ง๋ง MediaRecorder์์ ์ฝ๊ฐ ํค๋งธ๋๋ฐ ์๋ฃจ์ ์ด ์๋ ์นํ์ด์ง๊ฐ ์๊ธธ๋ ์ ๋ฆฌํด ๋๋ค.
MediaRecorder
์์์ฝ์ฝํ ๊ฒ๋ค์ ๋ํ๋จผํธ์ ์ ๋์ ์๋ค.์ธ๋ถ์ ์ฅ์์ ์ ์ฅํ๊ธฐ
recorder = new MediaRecorder(); recorder.setAudioSource(MediaRecorder.AudioSource.MIC); recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); recorder.setOutputFile(fileName);
์ฌ๊ธฐ์ setOutputFile์ fileName์ ์ ์ฅํ๊ณ ์ ํ๋ ํ์ผ๋ช
์ full path๋ง ์ฌ์ฉํ๋ฉด ๋๋ค.
์ด ํจ์๋ ๋ด๋ถ ์ ์ฅ์(data/data/{app_name})์์๋ ๊ณ ๋๋ก ์ฌ์ฉํ ์ ์๋ค.
ํ์ง๋ง MediaStore๋ก ์ ๊ทผํด์ผํ๋ ์ธ๋ถ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ ๋์๋ ๋์ด์ String์ผ๋ก๋ path๋ก ์ ๊ทผํ ์๊ฐ ์๋ค.
๊ทธ๋ ๋ค๋ฉด outputFile์ Path๋ฅผ ์ด๋ป๊ฒ ์ง์ ํ ์ ์์๊น?
setOutputFile์ FileDescriptor๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๊ฐ๋ ๊ฒ์ด ์๋๋ฐ ์ด๋ฅผ ์ด์ฉํ๋ค.
- ์ค์ ์์
FileDescriptor getFileDescriptor(){
ContentValues values = new ContentValues();
values.put(MediaStore.Video.Media.DISPLAY_NAME, "filename.MP4");
values.put(MediaStore.Video.Media.MIME_TYPE, "video/*");
ContentResolver resolver = getContentResolver();
Uri item = contentResolver.insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);
ParcelFileDescriptor fileDescriptor = null;
try {
fileDescriptor = resolver.openFileDescriptor(item, "w");
return fileDescriptor.getFileDescriptor();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return null;
}
์ด๋ ๊ฒ FileDescriptor๋ฅผ ์ป์ผ๋ฉด?
์๋๋ค.
๋ด๋ถ์ ์ฅ์๋ full path๋ง ๋ฃ์ผ๋ฉด ํ์ผ์ด ๋ฏธ๋ฆฌ ๋ง๋ค์ด์ ธ ์์ง ์์๋ ๊ทธ ์์น์ ๊ทธ ํ์ผ๋ช ์ผ๋ก write๊ฐ ๋์๋ ๋ฐ๋ฉด, ์ด๋ ๊ฒ ํ ๋์ ๋ด๊ฐ ์์ ํ์ผ์ ์์ฑํด ๋์ด์ผ ํ๋ค.
์ฌ๊ธฐ์ ๊ธฐ์กด ์ฝ๋๋ ๊ผฌ์์ด์ ์กฐ๊ธ ํค๋งธ๋ ๊ฑฐ์๋ค.
- ์ ์ ์์
FileDescriptor getFileDescriptor() {
ContentValues values = new ContentValues();
values.put(MediaStore.Video.Media.DISPLAY_NAME, "filename.MP4");
values.put(MediaStore.Video.Media.MIME_TYPE, "video/*");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
// ํด๋น ํ์ผ์ ๋ค๋ฅธ ์ฑ์์ ์ ๊ทผํ๋ ๊ฒ์ ๋ง๋ ํ๋๊ทธ.
values.put(MediaStore.Video.Media.IS_PENDING, 1);
}
ContentResolver resolver = getContentResolver();
Uri item = contentResolver.insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);
ParcelFileDescriptor fileDescriptor = null;
try {
// file write ์ถ๊ฐ
fileDescriptor = resolver.openFileDescriptor(item, "w");
if (fileDescriptor != null) {
// ๋น ํ์ผ ์์ฑ
String str = "hello";
byte[] strToByte = str.getBytes();
FileOutputStream fos = new FileOutputStream(fileDescriptor.getFileDescriptor());
fos.write(strToByte);
fos.close();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
values.clear();
// ํด๋น ํ์ผ์ ๋ค๋ฅธ ์ฑ์์ ์ ๊ทผํ๋ ๊ฒ์ ๋ค์ ํ์ฉ.
values.put(MediaStore.Images.Media.IS_PENDING, 0);
contentResolver.update(item, values, null, null);
}
return fileDescriptor.getFileDescriptor();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return null;
}
Recording์ด ์ ์์ ์ผ๋ก ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์์นํ๋ค๊ฐ ๋ชป ์ฐพ๊ณ ๊ถ๋ฆฌํด๋ธ ๋ฐฉ๋ฒ์ด๋ผ ์ ๋๋ก ๋ ์๋ฃจ์
์ด ๋ฐ๋ก ์์ ์ ์๋ค.
์ง์ ์ ์ธ์ ๋ ํ์.
- ์ด์ ๊ธ์ ์ต์๋์ธ์ผ๋ก ์ฎ๊ฒผ๋๋ ๋๊ธ ๊ธฐ๋ฅ์ด ์์ด ์ง์ ์ ๋ชป ๋ฐ๋๋ค. netlify๋ก deploy๋ ์ฌ์ดํธ๊ฐ ๊ตฌ๊ธ ๊ฒ์์ ์ ์ ๊ฑธ๋ฆฐ๋ค๊ณ ํด์ ๋ฐฉ๋ฌธ๊ฐ์ด ์์ ๊ฒ ๊ฐ์ง๋ง, ๊นํ ๋ธ๋ก๊ทธ ๋์ฒ๋ผ Utterances๋ฅผ ๋ถ์ผ ์ ์์ง ์์๊น ๊ฒํ ํด ๋ณผ ์์ .