Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Android

วิธีตรวจสอบโหมดเสียง (Ringer Mode) ใน Android ด้วย Kotlin

ตัวอย่างนี้สาธิตวิธี ตรวจสอบโหมดเสียงของอุปกรณ์ (Silent, Vibrate, Normal) โดยใช้ AudioManager.getRingerMode()

ขั้นตอนที่ 1: สร้างโปรเจกต์ใหม่

Android Studio → New Project → Empty Activity

ขั้นตอนที่ 2: Layout (activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="50dp"
        android:text="Ringer Mode Detection"
        android:textAlignment="center"
        android:textColor="@android:color/holo_green_dark"
        android:textSize="24sp"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/tvMode"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Detecting..."
        android:textAlignment="center"
        android:textColor="@android:color/holo_red_dark"
        android:textSize="28sp"
        android:textStyle="bold" />

</RelativeLayout>

ขั้นตอนที่ 3: โค้ดหลัก (MainActivity.kt)

import android.content.Context
import android.media.AudioManager
import android.os.Bundle
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        title = "Ringer Mode Demo"

        val tvMode = findViewById(R.id.tvMode)
        val audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager

        // 🔑 ดึง Ringer Mode ปัจจุบัน
        val ringerMode = audioManager.ringerMode

        val modeText = when (ringerMode) {
            AudioManager.RINGER_MODE_SILENT -> "🔇 Silent Mode"
            AudioManager.RINGER_MODE_VIBRATE -> "📳 Vibrate Mode"
            AudioManager.RINGER_MODE_NORMAL -> "🔊 Normal Mode"
            else -> "❓ Unknown"
        }

        tvMode.text = modeText
        Toast.makeText(this, modeText, Toast.LENGTH_SHORT).show()
    }
}

🔊 Ringer Mode Constants

Constant Value คำอธิบาย
RINGER_MODE_NORMAL 2 เสียงปกติ ร้องได้
RINGER_MODE_VIBRATE 1 สั่นเท่านั้น ไม่มีเสียง
RINGER_MODE_SILENT 0 เงียบสนิท ไม่สั่น ไม่ร้อง

🎛️ การตั้งค่าโหมดเสียง (ต้อง Permission)

<uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" />

// ในโค้ด (API 23+ ต้องขอ Permission Runtime)
audioManager.ringerMode = AudioManager.RINGER_MODE_SILENT
// หรือ
audioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE)

📱 ฟังการเปลี่ยนแปลง Ringer Mode (BroadcastReceiver)

// Manifest
<receiver android:name=".RingerModeReceiver">
    <intent-filter>
        <action android:name="android.media.RINGER_MODE_CHANGED" />
    </intent-filter>
</receiver>

// Receiver Class
class RingerModeReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        val mode = intent.getIntExtra(AudioManager.EXTRA_RINGER_MODE, -1)
        // Handle mode change
    }
}

⚠️ ข้อควรระวัง (Android 12+ / API 31+)

  • แอปทั่วไป **ไม่สามารถเปลี่ยน Ringer Mode ได้โดยตรง** แล้ว
  • ต้องนำผู้ใช้ไปที่ System Settings: Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS
  • อ่านค่า (Get) ยังทำได้ปกติ

ขั้นตอนที่ 4: AndroidManifest.xml

<uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" />
<!-- สำหรับการเปลี่ยนโหมดเท่านั้น การอ่านไม่ต้อง Permission -->

ทดสอบ

  1. รันแอป → แสดงโหมดปัจจุบัน
  2. กดปุ่ม Volume ลงจนเข้าสู่ Vibrate → รันใหม่ → แสดง "Vibrate Mode"
  3. กดต่อจนเข้าสู่ Silent → รันใหม่ → แสดง "Silent Mode"