Manage device ringer mode, volume levels, and audio settings for Capacitor apps.
- 🔔 Ringer Mode Control - Get and set device ringer mode (normal, vibrate, silent)
- 🔊 Volume Control - Get and set volume levels for different audio streams
- 🔕 Mute Detection - Check if the device is muted
- 🌙 DND Detection - Check if Do Not Disturb mode is enabled
- 📡 Event Listeners - Listen for ringer mode and volume changes in real-time
| Feature | Android | iOS | Web |
|---|---|---|---|
| getRingerMode | ✅ Real | ❌ | |
| setRingerMode | ✅ | ❌ | ❌ |
| getVolume | ✅ Real | ✅ Real | |
| setVolume | ✅ | ❌ | ❌ |
| isMuted | ✅ Real | ❌ | |
| getDndMode | ✅ | ❌ | ❌ |
| ringerModeChange event | ✅ Real | ❌ | |
| volumeChange event | ✅ | ✅ | ❌ |
Legend:
- ✅ Real - Native API provides accurate data
⚠️ Best-effort - Inferred from available data, may not reflect actual state⚠️ Mock - Returns placeholder values- ❌ - Not supported
npm install capacitor-audio-manager
npx cap syncTo change ringer mode on Android 7.0+ (API 24+), your app needs Do Not Disturb access permission:
- The user must manually grant this permission in device settings
- If permission is not granted,
setRingerMode()will reject with an error
// Check if permission is needed and prompt user
import { AudioManager } from 'capacitor-audio-manager';
try {
await AudioManager.setRingerMode({ mode: 'silent' });
} catch (error) {
// Permission denied - direct user to settings
console.log('Please grant Do Not Disturb access in Settings');
}On Android, the volumeChange event currently reports changes to the music stream only. Changes to ring, notification, or alarm streams are not individually tracked.
On Android, isMuted() returns true when the ringer mode is silent or vibrate (i.e., the ringer is not audible).
Web platform has very limited audio control capabilities:
- getRingerMode() - Always returns
"normal"(no ringer concept on web) - getVolume() - Returns
{ volume: 0, maxVolume: 0 }(system volume not accessible) - isMuted() - Always returns
false - getDndMode() - Always returns
false - setRingerMode() / setVolume() - Throws "not supported" error
- Events - Not fired on web platform
⚠️ These values are placeholders and should not be relied upon for application logic. Web platform is provided for development convenience only.
iOS does not expose APIs to reliably detect or control:
- Ringer mode (physical mute switch state)
- Do Not Disturb status
- System volume programmatically
- setRingerMode - Apple doesn't allow apps to change ringer mode
- setVolume - Apple restricts programmatic volume control
- getDndMode - Always returns
false(Apple doesn't expose DND status)
The following methods use best-effort detection based on output volume:
- getRingerMode() - Returns
"silent"when output volume is 0, otherwise"normal". This does not detect the physical mute switch state. - isMuted() - Returns
truewhen output volume is 0. This means "audio output is zero" not necessarily "mute switch is on". - ringerModeChange event - Inferred from volume changes, does not represent physical mute switch state.
- volumeChange event - Reflects system output volume changes only (music stream).
⚠️ Important: These values may not reflect the actual device state. iOS intentionally restricts access to ringer/mute information for privacy reasons.
getRingerMode()setRingerMode(...)getVolume(...)setVolume(...)isMuted()getDndMode()checkDndPermission()openDndSettings()addListener('ringerModeChange', ...)addListener('volumeChange', ...)removeAllListeners()- Interfaces
- Type Aliases
Audio Manager Plugin interface Provides methods to manage device ringer mode, volume levels, and audio settings
getRingerMode() => Promise<GetRingerModeResult>Get the current ringer mode
Returns: Promise<GetRingerModeResult>
Since: 1.0.0
setRingerMode(options: SetRingerModeOptions) => Promise<void>Set the ringer mode Note: On some Android devices, this requires Do Not Disturb access permission
| Param | Type | Description |
|---|---|---|
options |
SetRingerModeOptions |
- The ringer mode to set |
Since: 1.0.0
getVolume(options: GetVolumeOptions) => Promise<GetVolumeResult>Get the current volume for a specific audio stream
| Param | Type | Description |
|---|---|---|
options |
GetVolumeOptions |
- The audio stream to get volume for |
Returns: Promise<GetVolumeResult>
Since: 1.0.0
setVolume(options: SetVolumeOptions) => Promise<void>Set the volume for a specific audio stream
| Param | Type | Description |
|---|---|---|
options |
SetVolumeOptions |
- The audio stream and volume level to set |
Since: 1.0.0
isMuted() => Promise<IsMutedResult>Check if the device is currently muted
Returns: Promise<IsMutedResult>
Since: 1.0.0
getDndMode() => Promise<GetDndModeResult>Check if Do Not Disturb mode is enabled
Returns: Promise<GetDndModeResult>
Since: 1.0.0
checkDndPermission() => Promise<CheckDndPermissionResult>Check if DND access permission is granted Required on Android 7.0+ to change ringer mode
Returns: Promise<CheckDndPermissionResult>
Since: 1.0.0
openDndSettings() => Promise<void>Open the system settings to grant DND access permission Only available on Android
Since: 1.0.0
addListener(eventName: 'ringerModeChange', listenerFunc: (event: RingerModeChangeEvent) => void) => Promise<PluginListenerHandle>Add a listener for ringer mode changes
| Param | Type | Description |
|---|---|---|
eventName |
'ringerModeChange' |
- The event name |
listenerFunc |
(event: RingerModeChangeEvent) => void |
- The listener function |
Returns: Promise<PluginListenerHandle>
Since: 1.0.0
addListener(eventName: 'volumeChange', listenerFunc: (event: VolumeChangeEvent) => void) => Promise<PluginListenerHandle>Add a listener for volume changes
| Param | Type | Description |
|---|---|---|
eventName |
'volumeChange' |
- The event name |
listenerFunc |
(event: VolumeChangeEvent) => void |
- The listener function |
Returns: Promise<PluginListenerHandle>
Since: 1.0.0
removeAllListeners() => Promise<void>Remove all listeners for this plugin
Since: 1.0.0
Result of getting ringer mode
| Prop | Type | Description |
|---|---|---|
mode |
RingerMode |
Current ringer mode |
Options for setting ringer mode
| Prop | Type | Description |
|---|---|---|
mode |
RingerMode |
The ringer mode to set |
Result of getting volume
| Prop | Type | Description |
|---|---|---|
volume |
number |
Current volume level (0 to maxVolume) |
maxVolume |
number |
Maximum volume level for this stream |
Options for getting volume
| Prop | Type | Description |
|---|---|---|
stream |
AudioStream |
The audio stream type to get volume for |
Options for setting volume
| Prop | Type | Description |
|---|---|---|
stream |
AudioStream |
The audio stream type to set volume for |
volume |
number |
Volume level to set (0 to maxVolume) |
showUI |
boolean |
Whether to show the system volume UI (default: true) Only supported on Android |
Result of checking mute status
| Prop | Type | Description |
|---|---|---|
muted |
boolean |
Whether the device is muted |
Result of checking DND status
| Prop | Type | Description |
|---|---|---|
enabled |
boolean |
Whether Do Not Disturb mode is enabled |
Result of checking DND permission
| Prop | Type | Description |
|---|---|---|
granted |
boolean |
Whether DND access permission is granted |
| Prop | Type |
|---|---|
remove |
() => Promise<void> |
Event fired when ringer mode changes
| Prop | Type | Description |
|---|---|---|
mode |
RingerMode |
The new ringer mode |
Event fired when volume changes
| Prop | Type | Description |
|---|---|---|
stream |
AudioStream |
The audio stream that changed |
volume |
number |
The new volume level |
maxVolume |
number |
Maximum volume level for this stream |
Ringer mode types
- normal: Normal mode with sound
- vibrate: Vibrate only mode
- silent: Silent mode (no sound, no vibration)
'normal' | 'vibrate' | 'silent'
Audio stream types
- music: Media/music playback
- ring: Ringtone
- notification: Notification sounds
- alarm: Alarm sounds
- system: System sounds
- voiceCall: Voice call audio
'music' | 'ring' | 'notification' | 'alarm' | 'system' | 'voiceCall'
import { AudioManager } from 'capacitor-audio-manager';
// Get current state
const { mode } = await AudioManager.getRingerMode();
const { volume, maxVolume } = await AudioManager.getVolume({ stream: 'music' });
const { muted } = await AudioManager.isMuted();
const { enabled: dndEnabled } = await AudioManager.getDndMode();
console.log(`Mode: ${mode}, Volume: ${volume}/${maxVolume}, Muted: ${muted}, DND: ${dndEnabled}`);
// Set ringer mode (Android only)
await AudioManager.setRingerMode({ mode: 'vibrate' });
// Set volume (Android only)
await AudioManager.setVolume({ stream: 'music', volume: 8 });
// Listen for changes
AudioManager.addListener('ringerModeChange', (event) => {
console.log('Ringer mode changed:', event.mode);
});
AudioManager.addListener('volumeChange', (event) => {
console.log(`Volume changed: ${event.stream} = ${event.volume}`);
});See CONTRIBUTING.md for details on how to contribute to this project.
MIT
Selman Yasin Aktaş (@selmanyasinaktas)