后台音频播放只有效一次:Flutter iOS 中的问题

background audio playing works only once :issue in flutter ios

提问人:dev 提问时间:11/9/2023 最后编辑:dev 更新时间:11/20/2023 访问量:46

问:

我正在我的应用程序中使用带有just_audio的audio_service,当应用程序启动时,他们的播放器播放良好,背景也正常工作,但是当我再次进入应用程序(恢复应用程序)时,通知面板中的播放器小部件消失了,后台播放停止工作。 可能是什么问题?

在控制台中,我得到 [MRNowPlaying] 忽略 setPlaybackState,因为应用程序不包含平台的授权 com.apple.mediaremote.set-playback-state,并且我也在使用 FlutterVolumeController 包。

我的 DI 部分是

setUpLocators() async{
  // common
  
  sl.registerSingletonAsync<AudioHandler>(() async => await initAudioService());
  sl.registerLazySingleton<ThemeBloc>(() => ThemeBloc());
  sl.registerLazySingleton<AuthBloc>(() => AuthBloc(
        useCases: sl<AuthUseCases>(),
      ));

主要方法是

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp(
    options: DefaultFirebaseOptions.currentPlatform,
  );
  enableCrashlytics();

  /// setting the environment for production or staging.
  setEnv(EnvironmentType.production);

  setUpLocators();
  Bloc.observer = AppBlocObserver();
  setUpThemeChangeObserver();
  runApp(const MyApp());
}

AudioHandler 类是

Future<AudioHandler> initAudioService() async {
  return await AudioService.init(
    builder: () => MyAudioHandler(),
    config: const AudioServiceConfig(
      androidNotificationChannelId: 'io.exmple.audio',
      androidNotificationChannelName: 'name1',
      androidNotificationOngoing: true,
      androidStopForegroundOnPause: true,
    ),
  );
}

class MyAudioHandler extends BaseAudioHandler {
  final AudioPlayer _player = AudioPlayer();
  MyAudioHandler() {
    _player.playbackEventStream.map(_transformEvent).pipe(playbackState);
  }

  @override
  Future<void> playFromUri(Uri uri, [Map<String, dynamic>? extras]) async {
    mediaItem.add(MediaItem(id: uri.path.toString(), title: 'Sample'));

    _player.setAudioSource(
      HlsAudioSource(
        uri,
      ),
    );
    return;
  }

  @override
  Future<void> play() async {
    await _player.play();
    return super.play();
  }

  @override
  Future<void> pause() async {
    await _player.pause();
    return super.pause();
  }

  @override
  Future<void> stop() async {
    await _player.stop();
    return super.stop();
  }

  PlaybackState _transformEvent(PlaybackEvent event) {
    return PlaybackState(
      controls: [
        if (_player.playing) MediaControl.pause else MediaControl.play,
       
      ],
      androidCompactActionIndices: const [0, 1, 3],
      processingState: const {
        ProcessingState.idle: AudioProcessingState.idle,
        ProcessingState.loading: AudioProcessingState.loading,
        ProcessingState.buffering: AudioProcessingState.buffering,
        ProcessingState.ready: AudioProcessingState.ready,
        ProcessingState.completed: AudioProcessingState.completed,
      }[_player.processingState]!,
      playing: _player.playing,
      updatePosition: _player.position,
      bufferedPosition: _player.bufferedPosition,
      speed: _player.speed,
      queueIndex: event.currentIndex,
    );
  }

  @override
  Future<void> click([MediaButton button = MediaButton.media]) async {
    print('button===${button}');
    switch (button) {
      case MediaButton.media:
        {
          if (playbackState.valueOrNull?.playing == true) {
            await _player.pause();
          } else {
            await _player.play();
          }
          break;
        }
      case MediaButton.next:
      // TODO: Handle this case.
      case MediaButton.previous:
      // TODO: Handle this case.
    }
    return super.click(button);
  }
}

audioHandler 在 bloc 类中使用,如下所示。

AudioHandler playerHandler = sl<AudioHandler>();

 await playerHandler.playFromUri(Uri.parse(
            'https://demo.unified-streaming.com/k8s/features/stable/video/tears-of-steel/tears-of-steel.ism/.m3u8'
           
            ));

我创建了一个示例应用程序,其中包含与音频服务相同的代码(仅具有依赖项 audio_service 和 just_audio),并且它适用于后台。我不确定我的项目中的任何其他依赖项是否导致了这个问题。请帮帮我。

flutter-bloc just-audio audio-service 获取它

评论

0赞 Vladyslav Ulianytskyi 11/13/2023
视频或 giff 会很好:'但是当我再次进入应用程序(恢复应用程序)时,通知面板中的播放器小部件消失了,后台播放停止工作。

答:

0赞 dev 11/15/2023 #1

我正在使用flutter_volume_controller包,它导致了问题。我用 volume_controller 替换了包装,它工作得很好。

评论

0赞 Vladyslav Ulianytskyi 11/17/2023
你是怎么注意到原因到底是插件的?你到底是怎么理解的?
1赞 dev 11/17/2023
@VladyslavUlianytskyi我只用 just_audio 和 audio_service 创建了一个示例应用程序,它在后台工作正常,我的应用程序使用了这么多包。其他与音频相关的包就是这个flutter_volume_controller。我将其添加到我的示例应用程序中,问题 occurred.so 我将其替换为 volume_controller..现在工作正常。:-)