Hướng dẫn này minh họa cách phát hiện chế độ âm thanh (Ringer Mode: Silent, Vibrate, Normal) trên Android sử dụng Kotlin.
Bước 1: Tạo dự án mới
Mở Android Studio, chọn File → New Project và điền thông tin cần thiết.
Bước 2: Thiết kế giao diện (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="Tutorials Point"
android:textAlignment="center"
android:textColor="@android:color/holo_green_dark"
android:textSize="32sp"
android:textStyle="bold" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="Detect Android ringer mode"
android:textAlignment="center"
android:textColor="@android:color/holo_red_dark"
android:textSize="24sp"
android:textStyle="bold" />
</RelativeLayout>
Bước 3: Viết code MainActivity.kt
import android.content.Context
import android.media.AudioManager
import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import java.util.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
title = "KotlinApp"
val audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager
when (audioManager.ringerMode) {
AudioManager.RINGER_MODE_SILENT -> Toast.makeText(
this, "Chế độ Im lặng (Silent)", Toast.LENGTH_SHORT
).show()
AudioManager.RINGER_MODE_VIBRATE -> Toast.makeText(
this, "Chế độ Rung (Vibrate)", Toast.LENGTH_SHORT
).show()
AudioManager.RINGER_MODE_NORMAL -> Toast.makeText(
this, "Chế độ Bình thường (Normal)", Toast.LENGTH_SHORT
).show()
}
}
}
Bước 4: Cấu hình AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="com.example.q11">
<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>
</intent-filter>
</activity>
</application>
</manifest>
Chạy ứng dụng
Kết nối thiết bị, nhấn Run. App sẽ hiển thị Toast báo chế độ âm thanh hiện tại: Silent, Vibrate hoặc Normal.
Giải thích AudioManager.RingerMode
| Hằng số | Giá trị | Mô tả |
|---|---|---|
RINGER_MODE_SILENT | 0 | Im lặng hoàn toàn, không rung |
RINGER_MODE_VIBRATE | 1 | Rung, không phát âm thanh |
RINGER_MODE_NORMAL | 2 | Phát âm thanh bình thường |
Lắng nghe thay đổi chế độ (BroadcastReceiver)
// Register trong onCreate/onResume
val filter = IntentFilter(AudioManager.RINGER_MODE_CHANGED_ACTION)
registerReceiver(ringerModeReceiver, filter)
// Unregister trong onPause/onDestroy
unregisterReceiver(ringerModeReceiver)
private val ringerModeReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val audioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager
when (audioManager.ringerMode) {
AudioManager.RINGER_MODE_SILENT -> Log.d("Ringer", "Silent")
AudioManager.RINGER_MODE_VIBRATE -> Log.d("Ringer", "Vibrate")
AudioManager.RINGER_MODE_NORMAL -> Log.d("Ringer", "Normal")
}
}
}
Đổi chế độ âm thanh theo chương trình
audioManager.ringerMode = AudioManager.RINGER_MODE_SILENT audioManager.ringerMode = AudioManager.RINGER_MODE_VIBRATE audioManager.ringerMode = AudioManager.RINGER_MODE_NORMAL
Lưu ý: Từ Android 9 (API 28), cần quyền MODIFY_AUDIO_SETTINGS để thay đổi ringer mode. Từ Android 12 (API 31), policy nghiêm ngặt hơn.
Kiểm tra Do Not Disturb (DND) - API 24+
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
val isDnd = notificationManager.currentInterruptionFilter == NotificationManager.INTERRUPTION_FILTER_NONE
// isDnd = true khi bật "Không làm phiền"
}