提问人:dev 提问时间:11/9/2023 最后编辑:dev 更新时间:11/20/2023 访问量:46
后台音频播放只有效一次:Flutter iOS 中的问题
background audio playing works only once :issue in flutter ios
问:
我正在我的应用程序中使用带有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),并且它适用于后台。我不确定我的项目中的任何其他依赖项是否导致了这个问题。请帮帮我。
答:
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..现在工作正常。:-)
评论