반응형
https://github.com/jininim/decibel_measurement
GitHub - jininim/decibel_measurement: 안드로이드 데시벨 측정 앱 MediaRecorder
안드로이드 데시벨 측정 앱 MediaRecorder . Contribute to jininim/decibel_measurement development by creating an account on GitHub.
github.com
package com.example.recordaudio
import android.Manifest
import android.annotation.SuppressLint
import android.content.pm.PackageManager
import android.media.MediaRecorder
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.PackageManagerCompat.LOG_TAG
import com.example.recordaudio.databinding.ActivityMainBinding
import kotlinx.coroutines.*
import java.io.IOException
import java.util.*
private const val REQUEST_RECORD_AUDIO_PERMISSION = 200
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private var fileName: String = ""
private var recorder: MediaRecorder? = null
private var isRecording = false
private var job: Job? = null
// Requesting permission to RECORD_AUDIO
private var permissionToRecordAccepted = false
private var permissions: Array<String> = arrayOf(Manifest.permission.RECORD_AUDIO)
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
permissionToRecordAccepted = if (requestCode == REQUEST_RECORD_AUDIO_PERMISSION) {
grantResults[0] == PackageManager.PERMISSION_GRANTED
} else {
false
}
if (!permissionToRecordAccepted) finish()
}
@SuppressLint("RestrictedApi")
private fun startRecording() {
recorder = MediaRecorder().apply {
setAudioSource(MediaRecorder.AudioSource.MIC)//외부에서 들어오는 소리를 녹음
setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP)// 출력 파일 포맷을 설정
setOutputFile(fileName) // 출력파일 이름 설정
setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB)// 오디오 인코더를 설정
try {
prepare() // 초기화
} catch (e: IOException) {
Log.e(LOG_TAG, "prepare() failed") // 실패시
}
Toast.makeText(this@MainActivity,"녹음 시작",Toast.LENGTH_LONG).show()
start() // 녹음 시작
}
}
private fun stopRecording() {
isRecording = false
job?.cancel()
recorder?.apply {
stop() //녹음 중지
release()
}
Toast.makeText(this@MainActivity,"녹음 중지",Toast.LENGTH_LONG).show()
recorder = null
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
fileName = "${externalCacheDir?.absolutePath}/audiorecordtest.3gp"
ActivityCompat.requestPermissions(this, permissions, REQUEST_RECORD_AUDIO_PERMISSION)
setContentView(binding.root)
//start버튼 클릭
binding.start.setOnClickListener {
startRecording() // 녹음 시작
getDb() //데시벨 측정
}
//end 버튼클릭시
binding.stop.setOnClickListener {
stopRecording()// 녹음중지
}
}
override fun onStop() {
super.onStop()
recorder?.release()
recorder = null
}
//데시벨 측정 함수
private fun getDb(){
recorder?.let {
isRecording = true
//녹음이 중지 될 때 까지 작업 실행 텍스트에 데시벨 값 할당.
job = CoroutineScope(Dispatchers.Main).launch {
while (isRecording) {
delay(1000L) // 1초마다 데시벨 측정
val amplitude = it.maxAmplitude
binding.valueText.text = (20 * kotlin.math.log10(amplitude.toDouble())).toString()
}
}
}
}
}
데시벨 수치를 사용한 기능 개발을 위해 간단하게 데시벨을 측정할 수 있는 소스코드입니다.
전체 소스코드 MainActivity
반응형
'앱 개발일지' 카테고리의 다른 글
[안드로이드 앱 출시]Simple 장바구니 | 간단한 쇼핑 리스트 (0) | 2023.04.14 |
---|---|
[Android / Kotlin] 코틀린 Jsoup 사용 동행복권 웹 크롤링 (0) | 2023.02.21 |
[Android/Kotlin] compose 라이브러리 dice roller (0) | 2022.12.17 |
[Android/Kotlin] compose 라이브러리 사용해보기 (0) | 2022.11.24 |
android Studio/Kotlin과Compose 호환성 지도 (0) | 2022.11.24 |
댓글