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