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.
140 lines
3.7 KiB
140 lines
3.7 KiB
import 'package:deep_voice/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: '通知',
|
|
explanationText: '需要通知权限来显示音乐播放状态。',
|
|
permanentDenialText: '您已永久拒绝通知权限,请前往设置开启权限。',
|
|
settingsButtonText: '去设置',
|
|
cancelButtonText: '取消',
|
|
);
|
|
|
|
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,
|
|
}) async {
|
|
try {
|
|
await _musicService.setMediaSessionCallbacks(
|
|
onPlay: onPlay,
|
|
onPause: onPause,
|
|
onNext: onNext,
|
|
onPrevious: onPrevious,
|
|
onSeekTo: onSeekTo,
|
|
onStop: onStop,
|
|
);
|
|
} 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');
|
|
}
|
|
}
|
|
}
|
|
|