1import React, {useEffect, useRef, useState} from 'react'; 2import {AppState, StyleSheet} from 'react-native'; 3import rpx from '@/utils/rpx'; 4import AppBar from '@/components/base/appBar'; 5import VerticalSafeAreaView from '@/components/base/verticalSafeAreaView'; 6import globalStyle from '@/constants/globalStyle'; 7import StatusBar from '@/components/base/statusBar'; 8import ThemeText from '@/components/base/themeText'; 9import ListItem from '@/components/base/listItem'; 10import ThemeSwitch from '@/components/base/switch'; 11import LyricUtil from '@/native/lyricUtil'; 12import NativeUtils from '@/native/utils'; 13 14type IPermissionTypes = 'floatingWindow' | 'fileStorage'; 15 16export default function Permissions() { 17 const appState = useRef(AppState.currentState); 18 const [permissions, setPermissions] = useState< 19 Record<IPermissionTypes, boolean> 20 >({ 21 floatingWindow: false, 22 fileStorage: false, 23 // background: false, 24 }); 25 26 async function checkPermission(type?: IPermissionTypes) { 27 let newPermission = { 28 ...permissions, 29 }; 30 if (!type || type === 'floatingWindow') { 31 const hasPermission = await LyricUtil.checkSystemAlertPermission(); 32 newPermission.floatingWindow = hasPermission; 33 } 34 if (!type || type === 'fileStorage') { 35 const hasPermission = await NativeUtils.checkStoragePermission(); 36 console.log('HAS', hasPermission); 37 newPermission.fileStorage = hasPermission; 38 } 39 // if (!type || type === 'background') { 40 41 // } 42 43 setPermissions(newPermission); 44 } 45 46 useEffect(() => { 47 checkPermission(); 48 const subscription = AppState.addEventListener( 49 'change', 50 nextAppState => { 51 if ( 52 appState.current.match(/inactive|background/) && 53 nextAppState === 'active' 54 ) { 55 checkPermission(); 56 } 57 58 appState.current = nextAppState; 59 }, 60 ); 61 62 return () => { 63 subscription.remove(); 64 }; 65 }, []); 66 67 return ( 68 <VerticalSafeAreaView style={globalStyle.fwflex1}> 69 <StatusBar /> 70 <AppBar>权限管理</AppBar> 71 <ThemeText style={styles.description}> 72 此处列出了本 APP 73 需要的所有权限,你可以从这里开启或关闭某些权限。 74 </ThemeText> 75 <ListItem 76 withHorizonalPadding 77 heightType="big" 78 onPress={() => { 79 LyricUtil.requestSystemAlertPermission(); 80 }}> 81 <ListItem.Content 82 title="悬浮窗权限" 83 description="用以展示桌面歌词" 84 /> 85 <ThemeSwitch value={permissions.floatingWindow} /> 86 </ListItem> 87 <ListItem 88 withHorizonalPadding 89 heightType="big" 90 onPress={() => { 91 NativeUtils.requestStoragePermission(); 92 }}> 93 <ListItem.Content 94 title="文件读写权限" 95 description="用以下载歌曲、缓存数据" 96 /> 97 <ThemeSwitch value={permissions.fileStorage} /> 98 </ListItem> 99 {/* <ListItem withHorizonalPadding heightType="big"> 100 <ListItem.Content 101 title="后台运行" 102 description="用以在后台播放音乐"></ListItem.Content> 103 <ThemeSwitch value={permissions.background}></ThemeSwitch> 104 </ListItem> */} 105 </VerticalSafeAreaView> 106 ); 107} 108 109const styles = StyleSheet.create({ 110 description: { 111 width: '100%', 112 paddingHorizontal: rpx(24), 113 marginVertical: rpx(36), 114 }, 115}); 116