1import MusicQueue from '@/core/musicQueue'; 2import MusicSheet from '@/core/musicSheet'; 3import {check, PERMISSIONS, request} from 'react-native-permissions'; 4import TrackPlayer, {Capability} from 'react-native-track-player'; 5import 'react-native-get-random-values'; 6import {Platform, ToastAndroid} from 'react-native'; 7import Config from '@/core/config'; 8import RNBootSplash from 'react-native-bootsplash'; 9import RNFS, {exists, mkdir} from 'react-native-fs'; 10import Download from '@/core/download'; 11import pathConst from '@/constants/pathConst'; 12import {checkAndCreateDir} from '@/utils/fileUtils'; 13import {errorLog} from '@/utils/log'; 14import MediaMeta from '@/core/mediaMeta'; 15import Cache from '@/core/cache'; 16import PluginManager from '@/core/pluginManager'; 17 18/** app加载前执行 19 * 1. 检查权限 20 * 2. 数据初始化 21 * 3. 22 */ 23async function _bootstrap() { 24 // 1. 检查权限 25 const [readStoragePermission, writeStoragePermission] = await Promise.all([ 26 check(PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE), 27 check(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE), 28 ]); 29 if ( 30 !( 31 readStoragePermission === 'granted' && 32 writeStoragePermission === 'granted' 33 ) 34 ) { 35 await request(PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE); 36 await request(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE); 37 } 38 39 // 2. 数据初始化 40 /** 初始化路径 */ 41 await setupFolder(); 42 // 加载配置 43 await Promise.all([Config.setup(), MediaMeta.setup(), MusicSheet.setup()]) 44 // 加载插件 45 try { 46 await TrackPlayer.setupPlayer(); 47 } catch (e: any) { 48 if ( 49 e?.message !== 'The player has already been initialized via setupPlayer.' 50 ) { 51 throw e; 52 } 53 } 54 await TrackPlayer.updateOptions({ 55 progressUpdateEventInterval: 0.4, 56 stopWithApp: false, 57 alwaysPauseOnInterruption: true, 58 capabilities: [ 59 Capability.Play, 60 Capability.Pause, 61 Capability.SkipToNext, 62 Capability.SkipToPrevious, 63 ], 64 compactCapabilities: [ 65 Capability.Play, 66 Capability.Pause, 67 Capability.SkipToNext, 68 Capability.SkipToPrevious, 69 ], 70 notificationCapabilities: [ 71 Capability.Play, 72 Capability.Pause, 73 Capability.SkipToNext, 74 Capability.SkipToPrevious, 75 ], 76 }); 77 await Cache.setup() 78 await Download.setup(); 79 await PluginManager.setup(); 80 await MusicQueue.setup(); 81 82 83 ErrorUtils.setGlobalHandler(error => { 84 errorLog('未捕获的错误', error); 85 }); 86} 87 88/** 初始化 */ 89async function setupFolder() { 90 await Promise.all([ 91 checkAndCreateDir(pathConst.dataPath), 92 checkAndCreateDir(pathConst.logPath), 93 checkAndCreateDir(pathConst.cachePath), 94 checkAndCreateDir(pathConst.storagePath), 95 checkAndCreateDir(pathConst.pluginPath), 96 checkAndCreateDir(pathConst.lrcCachePath), 97 ]); 98} 99 100export default async function () { 101 try { 102 await _bootstrap(); 103 } catch (e) { 104 errorLog('初始化出错', e); 105 console.log(e); 106 } 107 // 隐藏开屏动画 108 console.log('HIDE'); 109 RNBootSplash.hide({fade: true}); 110} 111