Kotlin ile Sınıf Gürültü Seviyesi Ölçme Uygulaması

 

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
Copy
Download
Run
<?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

kotlin
Copy
Download
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
Copy
Download
Run
<?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:

  1. Gerçek zamanlı gürültü seviyesi ölçümü

  2. Desibel (dB) cinsinden ölçüm

  3. Gürültü seviyesini yorumlayan metin (Sessiz, Normal, Gürültülü, Çok Gürültülü)

  4. Mikrofon erişimi için izin yönetimi

  5. 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.



Yorum Gönder

0 Yorumlar