1import MusicQueue from '@/common/musicQueue'; 2import MusicSheet from '@/common/musicSheetManager'; 3import {check, PERMISSIONS, request} from 'react-native-permissions'; 4import TrackPlayer, {Capability} from 'react-native-track-player'; 5import {pluginManager} from '../common/pluginManager'; 6import 'react-native-get-random-values'; 7import {Platform, ToastAndroid} from 'react-native'; 8import {loadConfig} from '@/common/localConfigManager'; 9import RNBootSplash from 'react-native-bootsplash'; 10import RNFS, {exists, mkdir} from 'react-native-fs'; 11import DownloadManager from '@/common/downloadManager'; 12import pathConst from '@/constants/pathConst'; 13import { checkAndCreateDir } from '@/utils/fileUtils'; 14 15/** app加载前执行 */ 16export default async function () { 17 // 检查权限 18 const [readStoragePermission, writeStoragePermission] = await Promise.all([ 19 check(PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE), 20 check(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE), 21 ]); 22 if ( 23 !( 24 readStoragePermission === 'granted' && 25 writeStoragePermission === 'granted' 26 ) 27 ) { 28 await request(PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE); 29 await request(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE); 30 } 31 32 /** 初始化路径 */ 33 await setupFolder(); 34 // 加载配置 35 await loadConfig(); 36 // 加载插件 37 38 Promise.all([ 39 await pluginManager.setupPlugins(), 40 await TrackPlayer.setupPlayer(), 41 ]); 42 await TrackPlayer.updateOptions({ 43 progressUpdateEventInterval: 2, 44 stopWithApp: false, 45 alwaysPauseOnInterruption: true, 46 capabilities: [ 47 Capability.Play, 48 Capability.Pause, 49 Capability.SkipToNext, 50 Capability.SkipToPrevious, 51 ], 52 compactCapabilities: [ 53 Capability.Play, 54 Capability.Pause, 55 Capability.SkipToNext, 56 Capability.SkipToPrevious, 57 ], 58 notificationCapabilities: [ 59 Capability.Play, 60 Capability.Pause, 61 Capability.SkipToNext, 62 Capability.SkipToPrevious, 63 ], 64 }); 65 await MusicQueue.setupMusicQueue(); 66 await MusicSheet.setupMusicSheet(); 67 await DownloadManager.setupDownload(); 68 69 ErrorUtils.setGlobalHandler(error => 70 ToastAndroid.show(`error: ${error?.message}`, ToastAndroid.LONG), 71 ); 72 // 隐藏开屏动画 73 RNBootSplash.hide({fade: true}); 74} 75 76 77/** 初始化 */ 78async function setupFolder() { 79 await Promise.all([ 80 checkAndCreateDir(pathConst.dataPath), 81 checkAndCreateDir(pathConst.storagePath), 82 checkAndCreateDir(pathConst.pluginPath) 83 ]); 84} 85