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 maxCacheSize: 1024 * 1024 * 512, 46 }); 47 } catch (e: any) { 48 if ( 49 e?.message !== 50 'The player has already been initialized via setupPlayer.' 51 ) { 52 throw e; 53 } 54 } 55 await TrackPlayer.updateOptions({ 56 progressUpdateEventInterval: 0.4, 57 stopWithApp: false, 58 alwaysPauseOnInterruption: true, 59 capabilities: [ 60 Capability.Play, 61 Capability.Pause, 62 Capability.SkipToNext, 63 Capability.SkipToPrevious, 64 ], 65 compactCapabilities: [ 66 Capability.Play, 67 Capability.Pause, 68 Capability.SkipToNext, 69 Capability.SkipToPrevious, 70 ], 71 notificationCapabilities: [ 72 Capability.Play, 73 Capability.Pause, 74 Capability.SkipToNext, 75 Capability.SkipToPrevious, 76 ], 77 }); 78 await Cache.setup(); 79 await Download.setup(); 80 await PluginManager.setup(); 81 await MusicQueue.setup(); 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