Blame view

lib/utils/audio_player_util.dart 3.36 KB
b1869cf8   biao   背景音乐添加
1
  import 'package:audioplayers/audioplayers.dart';
523864dd   吴启风   feat:音频播放单例增加声明周期感知
2
  import 'package:flutter/cupertino.dart';
b1869cf8   biao   背景音乐添加
3
4
  import 'package:wow_english/common/extension/string_extension.dart';
  
2d1ead53   吴启风   feat:背景音播放优化
5
6
  import 'log_util.dart';
  
b1869cf8   biao   背景音乐添加
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  enum AudioPlayerUtilType {
    welcomeToWow('welcome_to_wow'),
    classTime('class_time'),
    gameTime('game_time'),
    musicTime('music_time'),
    readingTime('reading_time'),
    videoTime('video_time'),
    quizTime('quiz_time'),
    countWithMe('count_with_me_instrumental'),
    inMyTummy('in_my_tummy_instrumental'),
    touch('touch_instrumental');
  
    const AudioPlayerUtilType(this.path);
  
    final String path;
  }
  
523864dd   吴启风   feat:音频播放单例增加声明周期感知
24
  class AudioPlayerUtil extends WidgetsBindingObserver {
b1869cf8   biao   背景音乐添加
25
    static AudioPlayerUtil? _instance;
523864dd   吴启风   feat:音频播放单例增加声明周期感知
26
    late AudioPlayer _audioPlayer;
b1869cf8   biao   背景音乐添加
27
    late AudioPlayerUtilType currentType;
523864dd   吴启风   feat:音频播放单例增加声明周期感知
28
    bool _wasPlaying = false;
2d1ead53   吴启风   feat:背景音播放优化
29
    static const TAG = "AudioPlayerUtil";
b1869cf8   biao   背景音乐添加
30
31
32
  
    // 私有构造函数
    AudioPlayerUtil._internal() {
523864dd   吴启风   feat:音频播放单例增加声明周期感知
33
34
35
36
      // 监听应用生命周期
      WidgetsBinding.instance.addObserver(this);
      _audioPlayer = AudioPlayer();
      _audioPlayer.onPlayerStateChanged.listen((event) async {
b1869cf8   biao   背景音乐添加
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
        if (event == PlayerState.completed) {
          // 播放结束再次播放
          if (currentType == AudioPlayerUtilType.inMyTummy) {
            AudioPlayerUtil.getInstance()
                .playAudio(AudioPlayerUtilType.inMyTummy);
          }
          if (currentType == AudioPlayerUtilType.countWithMe) {
            AudioPlayerUtil.getInstance()
                .playAudio(AudioPlayerUtilType.countWithMe);
          }
          if (currentType == AudioPlayerUtilType.welcomeToWow) {
            AudioPlayerUtil.getInstance().playAudio(AudioPlayerUtilType.touch);
          }
          if (currentType == AudioPlayerUtilType.touch) {
            AudioPlayerUtil.getInstance().playAudio(AudioPlayerUtilType.touch);
          }
        }
      });
    }
  
    static AudioPlayerUtil getInstance() {
      _instance ??= AudioPlayerUtil._internal();
      return _instance!;
    }
  
  // 播放音频
    Future<void> playAudio(AudioPlayerUtilType type) async {
2d1ead53   吴启风   feat:背景音播放优化
64
      Log.d("$TAG playAudio $type");
b1869cf8   biao   背景音乐添加
65
66
      currentType = type;
      String path = type.path;
523864dd   吴启风   feat:音频播放单例增加声明周期感知
67
68
      await _audioPlayer.play(AssetSource(path.assetMp3), volume: 0.5);
      await _audioPlayer.onPlayerComplete.first;
b1869cf8   biao   背景音乐添加
69
70
71
    }
  
    // stop
523864dd   吴启风   feat:音频播放单例增加声明周期感知
72
    Future<void> stop() async {
2d1ead53   吴启风   feat:背景音播放优化
73
      Log.d("$TAG stop _audioPlayer.state=${_audioPlayer.state}");
9e29ffea   吴启风   feat:音频api调用优化
74
      await _audioPlayer.stop();
b1869cf8   biao   背景音乐添加
75
76
77
    }
  
    // pause
523864dd   吴启风   feat:音频播放单例增加声明周期感知
78
    Future<void> pause() async {
2d1ead53   吴启风   feat:背景音播放优化
79
      Log.d("$TAG pause _audioPlayer.state=${_audioPlayer.state}");
523864dd   吴启风   feat:音频播放单例增加声明周期感知
80
      if (_audioPlayer.state == PlayerState.playing) {
9e29ffea   吴启风   feat:音频api调用优化
81
        await _audioPlayer.pause();
b1869cf8   biao   背景音乐添加
82
83
84
85
      }
    }
  
    // resume
523864dd   吴启风   feat:音频播放单例增加声明周期感知
86
    Future<void> resume() async {
2d1ead53   吴启风   feat:背景音播放优化
87
      Log.d("$TAG resume _audioPlayer.state=${_audioPlayer.state}");
523864dd   吴启风   feat:音频播放单例增加声明周期感知
88
      if (_audioPlayer.state == PlayerState.paused) {
9e29ffea   吴启风   feat:音频api调用优化
89
        await _audioPlayer.resume();
b1869cf8   biao   背景音乐添加
90
91
      }
    }
523864dd   吴启风   feat:音频播放单例增加声明周期感知
92
93
94
  
    @override
    void didChangeAppLifecycleState(AppLifecycleState state) async {
2d1ead53   吴启风   feat:背景音播放优化
95
      Log.d("$TAG didChangeAppLifecycleState appState=$state _wasPlaying=$_wasPlaying _audioPlayer.state=${_audioPlayer.state}");
523864dd   吴启风   feat:音频播放单例增加声明周期感知
96
97
98
99
100
101
102
103
104
105
106
107
108
109
      if (state == AppLifecycleState.paused) {
        if (_audioPlayer.state == PlayerState.playing) {
          _wasPlaying = true;
          await pause();
        };
      } else if (state == AppLifecycleState.resumed) {
        if (_wasPlaying == true) {
          _wasPlaying = false;
          await resume();
        }
      }
    }
  
    void dispose() {
2d1ead53   吴启风   feat:背景音播放优化
110
      Log.d("$TAG dispose _audioPlayer.state=${_audioPlayer.state}");
523864dd   吴启风   feat:音频播放单例增加声明周期感知
111
112
113
      _audioPlayer.dispose();
      WidgetsBinding.instance.removeObserver(this);
    }
b1869cf8   biao   背景音乐添加
114
  }