Skip to content

Commit

Permalink
Playing sounds as alarms option (inway#3)
Browse files Browse the repository at this point in the history
* playing ringtone even if Android phone is in silent mode (@wrbl606)
* added AudioManager import (@wrbl606)
* asAlarm flag for Android, pubspec.lock versions bump, update README (@wrbl606)
* Update README.md (@wrbl606)
  • Loading branch information
wrbl606 authored and SPodjasek committed Dec 18, 2019
1 parent 5080a47 commit 805e457
Show file tree
Hide file tree
Showing 5 changed files with 76 additions and 50 deletions.
20 changes: 12 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,24 +18,28 @@ Then simply call this to play system default notification sound:
FlutterRingtonePlayer.playNotification();
```

You can also specify some additional parameters (works only on Android with API 28 and above):

```dart
FlutterRingtonePlayer.playNotification(volume: 0.5, looping: true);
```

There's also this generic method allowing you to specify in detail what kind of ringtone should be played:

```dart
FlutterRingtonePlayer.play(
android: AndroidSounds.notification,
ios: IosSounds.glass,
looping: true,
volume: 0.1,
looping: true, // Android only - API >= 28
volume: 0.1, // Android only - API >= 28
asAlarm: false, // Android only - all APIs
);
```

### .play*() optional attributes

| Attribute | Description |
| -------------- | ------------ |
| `bool` looping | Enables looping of ringtone. Requires `FlutterRingtonePlayer.stop();` to stop ringing. |
| `double` volume | Sets ringtone volume in range 0 to 1.0. |
| `bool` asAlarm | Allows to ignore device's silent/vibration mode and play given sound anyway. |


To stop looped ringtone please use:

```dart
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package io.inway.ringtone.player;

import android.content.Context;
import android.media.AudioManager;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
Expand Down Expand Up @@ -86,6 +87,20 @@ public void onMethodCall(MethodCall call, Result result) {
}
}

if (call.hasArgument("asAlarm")) {
final boolean asAlarm = call.argument("asAlarm");
/* There's also a .setAudioAttributes method
that is more flexible, but .setStreamType
is supported in all Android versions
whereas .setAudioAttributes needs SDK > 21.
More on that at
https://developer.android.com/reference/android/media/Ringtone
*/
if (asAlarm) {
ringtone.setStreamType(AudioManager.STREAM_ALARM);
}
}

ringtone.play();

result.success(null);
Expand Down
10 changes: 9 additions & 1 deletion example/lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import 'package:flutter/material.dart';

import 'package:flutter_ringtone_player/flutter_ringtone_player.dart';

void main() => runApp(MyApp());
Expand All @@ -24,6 +23,15 @@ class MyApp extends StatelessWidget {
},
),
),
Padding(
padding: EdgeInsets.all(8),
child: RaisedButton(
child: const Text('playAlarm asAlarm: false'),
onPressed: () {
FlutterRingtonePlayer.playAlarm(asAlarm: false);
},
),
),
Padding(
padding: EdgeInsets.all(8),
child: RaisedButton(
Expand Down
65 changes: 32 additions & 33 deletions lib/flutter_ringtone_player.dart
Original file line number Diff line number Diff line change
Expand Up @@ -24,62 +24,61 @@ class FlutterRingtonePlayer {
/// This is generic method allowing you to specify individual sounds
/// you wish to be played for each platform
///
/// [asAlarm] is an Android only flag that lets play given sound
/// as an alarm, that is, phone will make sound even if
/// it is in silent or vibration mode.
///
/// See also:
/// * [AndroidSounds]
/// * [IosSounds]
static Future<void> play({
@required AndroidSound android,
@required IosSound ios,
double volume,
bool looping,
}) async {
static Future<void> play(
{@required AndroidSound android,
@required IosSound ios,
double volume,
bool looping,
bool asAlarm}) async {
try {
var args = <String, dynamic>{
'android': android.value,
'ios': ios.value,
};
if (looping != null) args['looping'] = looping;
if (volume != null) args['volume'] = volume;
if (asAlarm != null) args['asAlarm'] = asAlarm;

_channel.invokeMethod('play', args);
} on PlatformException {}
}

/// Play default alarm sound (looping on Android)
static Future<void> playAlarm({
double volume,
bool looping = true,
}) async =>
static Future<void> playAlarm(
{double volume, bool looping = true, bool asAlarm = true}) async =>
play(
android: AndroidSounds.alarm,
ios: IosSounds.alarm,
volume: volume,
looping: looping,
);
android: AndroidSounds.alarm,
ios: IosSounds.alarm,
volume: volume,
looping: looping,
asAlarm: asAlarm);

/// Play default notification sound
static Future<void> playNotification({
double volume,
bool looping,
}) async =>
static Future<void> playNotification(
{double volume, bool looping, bool asAlarm = false}) async =>
play(
android: AndroidSounds.notification,
ios: IosSounds.triTone,
volume: volume,
looping: looping,
);
android: AndroidSounds.notification,
ios: IosSounds.triTone,
volume: volume,
looping: looping,
asAlarm: asAlarm);

/// Play default system ringtone (looping on Android)
static Future<void> playRingtone({
double volume,
bool looping = true,
}) async =>
static Future<void> playRingtone(
{double volume, bool looping = true, bool asAlarm = false}) async =>
play(
android: AndroidSounds.ringtone,
ios: IosSounds.electronic,
volume: volume,
looping: looping,
);
android: AndroidSounds.ringtone,
ios: IosSounds.electronic,
volume: volume,
looping: looping,
asAlarm: asAlarm);

/// Stop looping sounds like alarms & ringtones on Android.
/// This is no-op on iOS.
Expand Down
16 changes: 8 additions & 8 deletions pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@ packages:
name: async
url: "https://pub.dartlang.org"
source: hosted
version: "2.2.0"
version: "2.3.0"
boolean_selector:
dependency: transitive
description:
name: boolean_selector
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.4"
version: "1.0.5"
charcode:
dependency: transitive
description:
Expand Down Expand Up @@ -52,28 +52,28 @@ packages:
name: meta
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.6"
version: "1.1.7"
path:
dependency: transitive
description:
name: path
url: "https://pub.dartlang.org"
source: hosted
version: "1.6.2"
version: "1.6.4"
pedantic:
dependency: transitive
description:
name: pedantic
url: "https://pub.dartlang.org"
source: hosted
version: "1.7.0"
version: "1.8.0+1"
quiver:
dependency: transitive
description:
name: quiver
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.3"
version: "2.0.5"
sky_engine:
dependency: transitive
description: flutter
Expand Down Expand Up @@ -106,7 +106,7 @@ packages:
name: string_scanner
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.4"
version: "1.0.5"
term_glyph:
dependency: transitive
description:
Expand Down Expand Up @@ -136,4 +136,4 @@ packages:
source: hosted
version: "2.0.8"
sdks:
dart: ">=2.2.0 <3.0.0"
dart: ">=2.2.2 <3.0.0"

0 comments on commit 805e457

Please sign in to comment.