728x90
녹음을 하기전 매니페스트에 녹음과 파일의 읽기쓰기 권한을 명시해줘야한다.
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
매니페스트에 명시하고 해당 권한은 위험 권한에 속하기 때문에
유저에게도 권한을 승인받아야 한다.
empowerRecordAudioAndWriteReadStorage() 을 통해서 권한을 승인받고 녹음을 진행하게 되면
내폴더에 녹음 파일이 생기는것을 확인 할 수 있다.
class MainActivity : AppCompatActivity() {
private var outputPath: String? = null
private var mediaRecorder : MediaRecorder? = null
private var state : Boolean = false
@RequiresApi(Build.VERSION_CODES.R)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val startBtn = findViewById<Button>(R.id.button_start)
val stopBtn = findViewById<Button>(R.id.button_stop)
// 녹음 시작 버튼
startBtn.setOnClickListener {
// 권한 부여 여부
val isEmpower = ContextCompat.checkSelfPermission(this,
android.Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
// 권한 부여 되지 않았을경우
if (isEmpower) {
empowerRecordAudioAndWriteReadStorage()
// 권한 부여 되었을 경우
} else {
startRecording()
}
}
// 녹음 중지 버튼
stopBtn.setOnClickListener {
stopRecording()
}
}
// 레코딩, 파일 읽기 쓰기 권한부여
private fun empowerRecordAudioAndWriteReadStorage(){
val permissions = arrayOf(android.Manifest.permission.RECORD_AUDIO, android.Manifest.permission.WRITE_EXTERNAL_STORAGE, android.Manifest.permission.READ_EXTERNAL_STORAGE)
ActivityCompat.requestPermissions(this, permissions,0)
}
private fun startRecording(){
val fileName: String = Date().getTime().toString() + ".mp3"
outputPath = Environment.getExternalStorageDirectory().absolutePath + "/Download/" + fileName //내장메모리 밑에 위치
mediaRecorder = MediaRecorder()
mediaRecorder?.setAudioSource((MediaRecorder.AudioSource.MIC))
mediaRecorder?.setOutputFormat((MediaRecorder.OutputFormat.MPEG_4))
mediaRecorder?.setAudioEncoder(MediaRecorder.AudioEncoder.AAC)
mediaRecorder?.setOutputFile(outputPath)
try {
mediaRecorder?.prepare()
mediaRecorder?.start()
state = true
Toast.makeText(this, "녹음이 시작되었습니다.", Toast.LENGTH_SHORT).show()
} catch (e: IllegalStateException){
e.printStackTrace()
} catch (e: IOException){
e.printStackTrace()
}
}
private fun stopRecording(){
if(state){
mediaRecorder?.stop()
mediaRecorder?.reset()
mediaRecorder?.release()
state = false
Toast.makeText(this, "녹음이 되었습니다.", Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(this, "녹음 상태가 아닙니다.", Toast.LENGTH_SHORT).show()
}
}
}
'안드로이드 코틀린' 카테고리의 다른 글
[Kotlin][Android] 리사이클러뷰 (0) | 2022.02.19 |
---|---|
[Kotlin][Android] 텍스트뷰 생략 옵션 동적으로 변경하기 (0) | 2022.02.15 |
[Kotlin][Android] BroadCast 이벤트 송신, 수신하기 (0) | 2022.02.04 |
[Kotlin][Android] 더보기가 있는 텍스트뷰 만들기 (0) | 2022.02.03 |
[Kotlin][Android] 이미지 회전 (0) | 2022.01.30 |