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'; 12 13/** app加载前执行 */ 14export default async function () { 15 // 检查权限 16 const [readStoragePermission, writeStoragePermission] = await Promise.all([ 17 check(PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE), 18 check(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE), 19 ]); 20 if ( 21 !( 22 readStoragePermission === 'granted' && 23 writeStoragePermission === 'granted' 24 ) 25 ) { 26 await request(PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE); 27 await request(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE); 28 } 29 30 // 加载配置 31 await loadConfig(); 32 // 加载插件 33 34 Promise.all([ 35 await pluginManager.setupPlugins(), 36 await TrackPlayer.setupPlayer(), 37 ]); 38 await TrackPlayer.updateOptions({ 39 progressUpdateEventInterval: 2, 40 stopWithApp: false, 41 alwaysPauseOnInterruption: true, 42 capabilities: [ 43 Capability.Play, 44 Capability.Pause, 45 Capability.SkipToNext, 46 Capability.SkipToPrevious, 47 ], 48 compactCapabilities: [ 49 Capability.Play, 50 Capability.Pause, 51 Capability.SkipToNext, 52 Capability.SkipToPrevious, 53 ], 54 notificationCapabilities: [ 55 Capability.Play, 56 Capability.Pause, 57 Capability.SkipToNext, 58 Capability.SkipToPrevious, 59 ], 60 }); 61 await MusicQueue.setupMusicQueue(); 62 await MusicSheet.setupMusicSheet(); 63 await setupFolder(); 64 await DownloadManager.setupDownload(); 65 66 ErrorUtils.setGlobalHandler(error => 67 ToastAndroid.show(`error: ${error?.message}`, ToastAndroid.LONG), 68 ); 69 // 隐藏开屏动画 70 RNBootSplash.hide({fade: true}); 71} 72 73 74const basePath = 75 (Platform.OS === 'android' 76 ? RNFS.ExternalDirectoryPath 77 : RNFS.DocumentDirectoryPath); 78 79 async function checkAndCreate(path: string) { 80 const filePath = basePath + path; 81 if(!(await exists(filePath))) { 82 await mkdir(filePath); 83 } 84 } 85 /** 初始化 */ 86async function setupFolder(){ 87 await Promise.all([checkAndCreate('/data/')]) 88 89}