11import 'dart:async' ;
22import 'dart:io' ;
33
4+ import 'package:audio_session/audio_session.dart' ;
45import 'package:flutter/material.dart' ;
56import 'package:flutter/services.dart' ;
67import 'package:ogg_opus_player/ogg_opus_player.dart' ;
78import 'package:path/path.dart' as p;
89import 'package:path_provider/path_provider.dart' ;
910
11+ late AudioSession session;
12+
1013Future <void > main () async {
1114 WidgetsFlutterBinding .ensureInitialized ();
1215 final tempDir = await getTemporaryDirectory ();
1316 final workDir = p.join (tempDir.path, 'ogg_opus_player' );
1417 debugPrint ('workDir: $workDir ' );
18+ session = await AudioSession .instance;
1519 runApp (
1620 MaterialApp (
1721 home: Scaffold (
@@ -140,12 +144,15 @@ class _OpusOggPlayerWidgetState extends State<_OpusOggPlayerWidget> {
140144 )
141145 else
142146 IconButton (
143- onPressed: () {
147+ onPressed: () async {
144148 _player? .dispose ();
145149 _speedIndex = 1 ;
146150 _player = OggOpusPlayer (widget.path);
151+ session.configure (const AudioSessionConfiguration .music ());
152+ bool active = await session.setActive (true );
153+ debugPrint ('active: $active ' );
147154 _player? .play ();
148- _player? .state.addListener (() {
155+ _player? .state.addListener (() async {
149156 setState (() {});
150157 if (_player? .state.value == PlayerState .ended) {
151158 _player? .dispose ();
@@ -158,8 +165,14 @@ class _OpusOggPlayerWidgetState extends State<_OpusOggPlayerWidget> {
158165 IconButton (
159166 onPressed: () {
160167 setState (() {
168+ debugPrint ('ended' );
161169 _player? .dispose ();
162170 _player = null ;
171+ session.setActive (false ).then ((value) {
172+ debugPrint ('active: $value ' );
173+ }).onError ((error, stackTrace) {
174+ debugPrint ('error: $error ' );
175+ });
163176 });
164177 },
165178 icon: const Icon (Icons .stop),
@@ -212,12 +225,19 @@ class _RecorderExampleState extends State<_RecorderExample> {
212225 const SizedBox (height: 8 ),
213226 if (_recorder == null )
214227 IconButton (
215- onPressed: () {
228+ onPressed: () async {
216229 final file = File (_recordedPath);
217230 if (file.existsSync ()) {
218231 File (_recordedPath).deleteSync ();
219232 }
220233 File (_recordedPath).createSync (recursive: true );
234+ await session.configure (const AudioSessionConfiguration (
235+ avAudioSessionCategory: AVAudioSessionCategory .playAndRecord,
236+ avAudioSessionCategoryOptions:
237+ AVAudioSessionCategoryOptions .allowBluetooth,
238+ avAudioSessionMode: AVAudioSessionMode .spokenAudio,
239+ ));
240+ await session.setActive (true );
221241 final recorder = OggOpusRecorder (_recordedPath);
222242 recorder.start ();
223243 setState (() {
@@ -236,6 +256,11 @@ class _RecorderExampleState extends State<_RecorderExample> {
236256 _recorder? .dispose ();
237257 setState (() {
238258 _recorder = null ;
259+ session.setActive (
260+ false ,
261+ avAudioSessionSetActiveOptions:
262+ AVAudioSessionSetActiveOptions .notifyOthersOnDeactivation,
263+ );
239264 });
240265 },
241266 icon: const Icon (Icons .stop),
0 commit comments