ตัวอย่างนี้สาธิตวิธี ตรวจสอบโหมดเสียงของอุปกรณ์ (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 -->
ทดสอบ
- รันแอป → แสดงโหมดปัจจุบัน
- กดปุ่ม Volume ลงจนเข้าสู่ Vibrate → รันใหม่ → แสดง "Vibrate Mode"
- กดต่อจนเข้าสู่ Silent → รันใหม่ → แสดง "Silent Mode"