Однако у меня возникли проблемы с реализацией. Ниже приведен мой файл main.dart.
main.dart
import 'package:flutter/material.dart';
import 'package:audio_service/audio_service.dart';
import 'package:media_kit/media_kit.dart';
import 'package:media_kit_video/media_kit_video.dart';
late VideoMediaHandler handler;
Future main() async {
WidgetsFlutterBinding.ensureInitialized();
MediaKit.ensureInitialized();
handler = await AudioService.init(
builder: () => VideoMediaHandler(),
config: const AudioServiceConfig(
androidNotificationChannelId: 'com.example.notification',
androidNotificationChannelName: 'Video Playback',
androidNotificationOngoing: true,
),
);
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
home: Scaffold(
body: VideoPlayerPage(),
),
);
}
}
class VideoPlayerPage extends StatefulWidget {
const VideoPlayerPage({super.key});
@override
State createState() => _VideoPlayerPageState();
}
class _VideoPlayerPageState extends State {
late final Player player = Player();
late final VideoController controller = VideoController(player);
@override
void initState() {
super.initState();
const videoUrl =
'[https://flutter.github.io/assets-for-ap ... os/bee.mp4](https://flutter.github.io/assets-for-ap ... os/bee.mp4)';
handler.setPlayer(player);
player.open(Media(videoUrl));
handler.playMedia(
videoUrl,
'Bee Video',
'Flutter Demo',
'[
);
}
@override
void dispose() {
player.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Center(
child: SizedBox(
width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.width * 9 / 16,
child: Video(
controller: controller,
),
),
);
}
}
class VideoMediaHandler extends BaseAudioHandler {
Player? _player;
void setPlayer(Player player) {
_player = player;
_player!.stream.playing.listen((_) => _updateState());
_player!.stream.position.listen((_) => _updateState());
_player!.stream.buffer.listen((_) => _updateState());
_player!.stream.duration.listen((duration) {
final item = mediaItem.value;
if (item != null) {
mediaItem.add(item.copyWith(duration: duration));
}
});
}
void _updateState() {
if (_player == null) return;
final playing = _player!.state.playing;
playbackState.add(
PlaybackState(
controls: [
MediaControl.skipToPrevious,
playing ? MediaControl.pause : MediaControl.play,
MediaControl.skipToNext,
],
playing: playing,
processingState: AudioProcessingState.ready,
updatePosition: _player!.state.position,
bufferedPosition: _player!.state.buffer,
speed: 1.0,
systemActions: const {
MediaAction.seek,
MediaAction.seekForward,
MediaAction.seekBackward,
MediaAction.stop,
},
),
);
}
Future playMedia(
String url,
String title,
String artist,
String artUri,
) async {
mediaItem.add(
MediaItem(
id: url,
title: title,
album: artist,
artUri: Uri.parse(artUri),
),
);
}
@override
Future play() async {
await _player?.play();
}
@override
Future pause() async {
await _player?.pause();
}
@override
Future seek(Duration position) async {
await _player?.seek(position);
}
@override
Future stop() async {
await _player?.pause();
}
}
**AndroidManifest.xml**
Подробнее здесь: https://stackoverflow.com/questions/798 ... rvice-noti
Мобильная версия