Kotlin ile Sınıf Gürültü Seviyesi Ölçme Uygulaması
Aşağıda, Android platformunda çalışan ve sınıf içindeki gürültü seviyesini ölçen basit bir Kotlin uygulaması örneği bulabilirsiniz:
1. AndroidManifest.xml (İzinler için)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.noisemeasure">
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>2. MainActivity.kt
import android.Manifest
import android.content.pm.PackageManager
import android.media.MediaRecorder
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import java.io.IOException
import kotlin.math.log10
class MainActivity : AppCompatActivity() {
private lateinit var mediaRecorder: MediaRecorder
private var isRecording = false
private lateinit var noiseLevelTextView: TextView
private val handler = Handler(Looper.getMainLooper())
private val delayMillis = 1000L // 1 saniyede bir ölçüm yap
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
noiseLevelTextView = findViewById(R.id.noiseLevelTextView)
// Mikrofon izni kontrolü
if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(
this,
arrayOf(Manifest.permission.RECORD_AUDIO),
RECORD_AUDIO_PERMISSION_CODE
)
} else {
startNoiseMeasurement()
}
}
private fun startNoiseMeasurement() {
mediaRecorder = MediaRecorder()
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC)
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP)
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB)
mediaRecorder.setOutputFile("/dev/null") // Ses kaydetme, sadece ölçüm
try {
mediaRecorder.prepare()
mediaRecorder.start()
isRecording = true
updateNoiseLevel()
} catch (e: IllegalStateException) {
e.printStackTrace()
} catch (e: IOException) {
e.printStackTrace()
}
}
private fun updateNoiseLevel() {
if (isRecording) {
val amplitude = mediaRecorder.maxAmplitude.toDouble()
val noiseLevel = if (amplitude > 0) {
20 * log10(amplitude / REFERENCE)
} else {
0.0
}
val noiseText = when {
noiseLevel < 30 -> "Sessiz (${"%.1f".format(noiseLevel)} dB)"
noiseLevel < 60 -> "Normal (${"%.1f".format(noiseLevel)} dB)"
noiseLevel < 80 -> "Gürültülü (${"%.1f".format(noiseLevel)} dB)"
else -> "Çok Gürültülü (${"%.1f".format(noiseLevel)} dB)"
}
noiseLevelTextView.text = noiseText
handler.postDelayed({ updateNoiseLevel() }, delayMillis)
}
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == RECORD_AUDIO_PERMISSION_CODE) {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
startNoiseMeasurement()
} else {
Toast.makeText(
this,
"Mikrofon izni olmadan gürültü seviyesi ölçülemez",
Toast.LENGTH_LONG
).show()
}
}
}
override fun onDestroy() {
super.onDestroy()
if (isRecording) {
mediaRecorder.stop()
mediaRecorder.release()
isRecording = false
}
handler.removeCallbacksAndMessages(null)
}
companion object {
private const val RECORD_AUDIO_PERMISSION_CODE = 101
private const val REFERENCE = 0.00002 // Referans ses basıncı (20 mikroPascal)
}
}3. activity_main.xml (Arayüz)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
android:padding="16dp"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Sınıf Gürültü Seviyesi"
android:textSize="24sp"
android:textStyle="bold"
android:layout_marginBottom="32dp"/>
<TextView
android:id="@+id/noiseLevelTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Ölçülüyor..."
android:textSize="20sp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Gürültü Seviyesi Kılavuzu:"
android:textSize="18sp"
android:layout_marginTop="32dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="• 0-30 dB: Sessiz\n• 30-60 dB: Normal\n• 60-80 dB: Gürültülü\n• 80+ dB: Çok Gürültülü"
android:layout_marginTop="8dp"/>
</LinearLayout>Özellikler:
Gerçek zamanlı gürültü seviyesi ölçümü
Desibel (dB) cinsinden ölçüm
Gürültü seviyesini yorumlayan metin (Sessiz, Normal, Gürültülü, Çok Gürültülü)
Mikrofon erişimi için izin yönetimi
Basit ve anlaşılır kullanıcı arayüzü
Geliştirilebilir Özellikler:
Verileri kaydetme ve grafik oluşturma
Belirli bir seviyeyi aşınca uyarı verme
Geçmiş verileri görüntüleme
Farklı zaman aralıklarında ortalama gürültü seviyesi hesaplama
Uygulama, Android cihazın mikrofonunu kullanarak ortam gürültüsünü ölçer ve desibel cinsinden ekranda gösterir.
0 Yorumlar