sound_mode_advanced

pub package License: MIT

A Flutter plugin for detecting and controlling the ringer mode (Normal, Silent, Vibrate) on Android devices. Also supports detecting ringer mode status on iOS (read-only).

Community-maintained fork of TryingOutSomething/sound_mode, republished as sound_mode_advanced on pub.dev because the upstream maintainer is no longer accepting pull requests.

Installation

Add sound_mode_advanced to your pubspec.yaml:

dependencies:
  sound_mode_advanced: ^4.0.0

Then run:

flutter pub get

Android Setup

Permissions

To allow the app to change ringer mode on Android 6.0+, you need to request Do Not Disturb access. Add the following permission to your AndroidManifest.xml:

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

Place this inside the <manifest> tag, not inside <application>.

Usage

Get current ringer mode

import 'package:sound_mode_advanced/sound_mode_advanced.dart';

RingerModeStatus ringerStatus = await SoundMode.ringerModeStatus;
print(ringerStatus);

Change ringer mode (Android only)

import 'package:sound_mode_advanced/sound_mode_advanced.dart';

try {
  await SoundMode.setSoundMode(RingerModeStatus.silent);
} on PlatformException {
  print('Please enable the required permissions');
}

Handling Do Not Disturb Access (Android 6.0+)

import 'package:sound_mode_advanced/sound_mode_advanced.dart';

bool? isGranted = await PermissionHandler.permissionsGranted;

if (isGranted != true) {
  await PermissionHandler.openDoNotDisturbSetting();
}

iOS Support

Warning: iOS support is currently experimental and unreliable. Reading the ringer mode status may not work consistently across all devices and OS versions. This feature also does not work on iOS simulators — only real devices.

A short delay is recommended before reading the ringer status for more reliable results:

import 'package:sound_mode_advanced/sound_mode_advanced.dart';

RingerModeStatus ringerStatus = RingerModeStatus.unknown;

Future.delayed(const Duration(seconds: 1), () async {
  try {
    ringerStatus = await SoundMode.ringerModeStatus;
  } catch (err) {
    ringerStatus = RingerModeStatus.unknown;
  }
  print(ringerStatus);
});

RingerModeStatus Values

Value Description
RingerModeStatus.unknown Unknown or unsupported status
RingerModeStatus.normal Device is in Normal mode
RingerModeStatus.silent Device is in Silent mode
RingerModeStatus.vibrate Device is in Vibrate mode

Issues

Please file issues on GitHub.

License

MIT — see LICENSE. Original work Copyright (c) 2020 Jan Owyeong Guo Yong.