You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

142 lines
3.8 KiB

import '../../core/utils/logger.dart';
import 'package:get/get.dart';
import 'package:music_service/music_service.dart';
import 'package:permission_handler/permission_handler.dart';
import '../../core/utils/permission_util.dart';
import 'package:flutter/material.dart';
//音乐播放管理
class MusicManager extends GetxService {
static MusicManager get to => Get.find<MusicManager>();
// 音乐服务实例
final MusicService _musicService = MusicService();
/// 初始化
@override
void onInit() {
super.onInit();
// final context = Get.context;
// if (context == null) {
// Logger.error('无法获取 BuildContext');
// return;
// }
requestNotificationPermission();
Logger.info('初始化权限请求');
}
Future<void> requestNotificationPermission() async {
final granted = await PermissionUtil.instance.requestPermission(
//context: context,
permissionType: Permission.notification,
permissionName: 'notificationPermission'.tr,
explanationText: 'notificationPermissionExplanation'.tr,
permanentDenialText: 'notificationPermissionPermanentDenial'.tr,
settingsButtonText: 'goToSettings'.tr,
cancelButtonText: 'cancel'.tr,
);
if (!granted) {
Logger.warning('通知权限未被授予');
return;
}
Logger.info('通知权限已授予');
}
/// 释放资源
@override
void onClose() {
super.onClose();
}
//播放
Future<void> play(Map<String, dynamic> song) async {
await _musicService.playMusic(song);
}
//暂停
Future<void> pause() async {
await _musicService.pauseMusic();
}
//继续
Future<void> resume() async {
await _musicService.resumeMusic();
}
//状态
Future<Map<String, dynamic>> getStatus() async {
return await _musicService.getStatus();
}
//获取播放进度
Future<Map<String, dynamic>> getProgress() async {
return await _musicService.getProgress();
}
//跳转到指定位置
Future<void> seekTo(int positionMs) async {
await _musicService.seekTo(positionMs);
}
/// 播放音乐列表
Future<void> playPlaylist(List<Map<String, dynamic>> playlist) async {
await _musicService.playMusicPlaylist(playlist);
}
/// 更新媒体会话进度信息
Future<void> updateMediaSessionProgress(
int currentPosition, int duration, double progress) async {
try {
await _musicService.updateMediaSessionProgress(
currentPosition, duration, progress);
} catch (e) {
Logger.d('MusicManager', '更新媒体会话进度失败: $e');
}
}
/// 设置媒体会话回调
Future<void> setMediaSessionCallbacks({
required Function() onPlay,
required Function() onPause,
required Function() onNext,
required Function() onPrevious,
required Function(int) onSeekTo,
required Function() onStop,
required Function(int, int, int, double) onProgress,
}) async {
try {
await _musicService.setMediaSessionCallbacks(
onPlay: onPlay,
onPause: onPause,
onNext: onNext,
onPrevious: onPrevious,
onSeekTo: onSeekTo,
onStop: onStop,
onProgress: onProgress,
);
} catch (e) {
Logger.d('MusicManager', '设置媒体会话回调失败: $e');
}
}
/// 更新媒体会话元数据
Future<void> updateMediaSessionMetadata(Map<String, dynamic> song) async {
try {
await _musicService.updateMediaSessionMetadata(song);
} catch (e) {
Logger.d('MusicManager', '更新媒体会话元数据失败: $e');
}
}
/// 更新媒体会话播放状态
Future<void> updateMediaSessionPlaybackState(bool isPlaying) async {
try {
await _musicService.updateMediaSessionPlaybackState(isPlaying);
} catch (e) {
Logger.d('MusicManager', '更新媒体会话播放状态失败: $e');
}
}
}