# 管ç†å¤–ç½®å˜å‚¨è®¾å¤‡ï¼ˆä»…对系统应用开放) 外置å˜å‚¨è®¾å¤‡å…·å¤‡å¯æ’æ‹”å±žæ€§ï¼Œå› æ¤ç³»ç»Ÿæä¾›äº†è®¾å¤‡æ’拔事件的监å¬åŠæŒ‚载功能,用于管ç†å¤–ç½®å˜å‚¨è®¾å¤‡ã€‚ 外置å˜å‚¨è®¾å¤‡çš„管ç†ç”±StorageManagerå’ŒStorageDaemon两个æœåŠ¡å®Œæˆã€‚StorageDaemonå®žçŽ°åº•å±‚çš„çš„ç›‘å¬æŒ‚è½½ç‰åŠŸèƒ½ï¼›StorageManager则对系统应用æä¾›çжæ€å˜æ›´é€šçŸ¥ã€æŸ¥è¯¢å’Œç®¡ç†èƒ½åŠ›ã€‚ **图1** 外置å˜å‚¨è®¾å¤‡ç®¡ç†ç¤ºæ„图   - æ’入外塿—¶ï¼ŒStorageDaemon进程通过netlink监å¬èŽ·å–åˆ°å¤–å¡æ’入事件,创建对应的ç£ç›˜è®¾å¤‡ä»¥åŠå·è®¾å¤‡ï¼Œæ¤æ—¶ï¼Œå·²åˆ›å»ºçš„å·è®¾å¤‡çжæ€ä¸ºå¸è½½çжæ€ï¼ˆUNMOUNTED)。 - StorageDaemon进程在创建完å·è®¾å¤‡åŽï¼Œä¼šå¯¹å·è®¾å¤‡è¿›è¡Œæ£€æŸ¥ï¼Œæ¤æ—¶å·çжæ€ä¸ºæ£€æŸ¥çжæ€ï¼ˆCHECKING)。 - **检查æˆåŠŸ**:对å·è®¾å¤‡è¿›è¡ŒæŒ‚载,挂载æˆåŠŸåŽï¼Œå·çŠ¶æ€æ›´æ”¹ä¸ºæŒ‚载状æ€ï¼ˆMOUNTED),并通知StorageManagerå‘é€COMMON_EVENT_VOLUME_MOUNTED广æ’。 - **检查失败**:则返回å¸è½½çжæ€ï¼ˆUNMOUNTED)。 - 当å·è®¾å¤‡å¤„äºŽæŒ‚è½½çŠ¶æ€æ—¶ï¼š - **用户选择弹出**:å·çжæ€è®¾å¤‡æ›´æ”¹ä¸ºæ£åœ¨å¼¹å‡ºçжæ€ï¼ˆEJECTING),并å‘é€COMMON_EVENT_VOLUME_EJECT广æ’。StorageDaemon进程将å·è®¾å¤‡å¸è½½æˆåŠŸåŽï¼Œå·çŠ¶æ€æ›´æ”¹ä¸ºå¸è½½çжæ€ï¼ˆUNMOUNTED),并å‘é€COMMON_EVENT_VOLUME_UNMOUNTED广æ’。 <br>当å·è®¾å¤‡å¤„于å¸è½½çжæ€åŽï¼Œæ‹”出å·è®¾å¤‡ä¼šåˆ 除相关å·è®¾å¤‡ä¿¡æ¯ï¼Œå¹¶å‘é€COMMON_EVENT_VOLUME_REMOVED广æ’。 - **拔出外å¡**:å·è®¾å¤‡çжæ€åŒæ ·ä¼šç»åކæ£åœ¨å¼¹å‡ºçжæ€ï¼ˆEJECTING)和å¸è½½çжæ€ï¼ˆUNMOUNTED),并å‘é€å¯¹åº”阶段的广æ’。在拔出åŽï¼Œåˆ 除相关å·è®¾å¤‡ä¿¡æ¯ï¼Œå‘é€COMMON_EVENT_VOLUME_BAD_REMOVAL广æ’。 ## 接å£è¯´æ˜Ž 外置å˜å‚¨è®¾å¤‡ç®¡ç†ç›¸å…³API的详细介ç»è¯·å‚è§[APIå‚考](../reference/apis-core-file-kit/js-apis-file-volumemanager-sys.md)。 å„类广æ’ä¼ é€’çš„ç›¸å…³å‚æ•°ï¼Œè¯·è§ä¸‹è¡¨ã€‚ **表1** 广æ’ä¼ é€’çš„å‚æ•° | 广æ’类型 | 傿•° | | -------- | -------- | | usual.event.data.VOLUME_REMOVED | id:å·è®¾å¤‡ID<br/>diskId:å·è®¾å¤‡æ‰€å±žç£ç›˜è®¾å¤‡ID | | usual.event.data.VOLUME_UNMOUNTED | id:å·è®¾å¤‡ID<br/>diskId:å·è®¾å¤‡æ‰€å±žç£ç›˜è®¾å¤‡ID<br/>volumeState:å·è®¾å¤‡çŠ¶æ€ | | usual.event.data.VOLUME_MOUNTED | id:å·è®¾å¤‡ID<br/>diskId:å·è®¾å¤‡æ‰€å±žç£ç›˜è®¾å¤‡ID<br/>volumeState:å·è®¾å¤‡çжæ€<br/>fsUuid:å·è®¾å¤‡uuid<br/>path:å·è®¾å¤‡æŒ‚载路径 | | usual.event.data.VOLUME_BAD_REMOVAL | id:å·è®¾å¤‡ID<br/>diskId:å·è®¾å¤‡æ‰€å±žç£ç›˜è®¾å¤‡ID | | usual.event.data.VOLUME_EJECT | id:å·è®¾å¤‡ID<br/>diskId:å·è®¾å¤‡æ‰€å±žç£ç›˜è®¾å¤‡ID<br/>volumeState:å·è®¾å¤‡çŠ¶æ€ | ## 开呿¥éª¤ å¼€å‘者通过订阅å·è®¾å¤‡ç›¸å…³çš„广æ’äº‹ä»¶æ¥æ„ŸçŸ¥å¤–ç½®å˜å‚¨çš„æ’å…¥ï¼Œé€šè¿‡å¹¿æ’ä¼ é€’çš„ä¿¡æ¯èŽ·å–å·è®¾å¤‡ä¿¡æ¯åŽå¯ä»¥å¯¹å·è®¾å¤‡è¿›è¡ŒæŸ¥è¯¢ä»¥åŠç®¡ç†æ“作。 1. èŽ·å–æƒé™ã€‚ 订阅å·è®¾å¤‡å¹¿æ’事件需è¦ç”³è¯·ohos.permission.STORAGE_MANAGERæƒé™ï¼Œé…置方å¼è¯·å‚è§[申请应用æƒé™](../security/AccessToken/determine-application-mode.md#system_basicç‰çº§åº”用申请æƒé™çš„æ–¹å¼)。 2. 订阅广æ’事件。 需订阅的事件如下: - å·è®¾å¤‡ç§»é™¤ï¼š"usual.event.data.VOLUME_REMOVED" - å·è®¾å¤‡å¸è½½ï¼š"usual.event.data.VOLUME_UNMOUNTED" - å·è®¾å¤‡æŒ‚载:"usual.event.data.VOLUME_MOUNTED" - å·è®¾å¤‡å¼‚常移除:"usual.event.data.VOLUME_BAD_REMOVAL" - å·è®¾å¤‡æ£åœ¨å¼¹å‡ºï¼š"usual.event.data.VOLUME_EJECT" ```ts import { commonEventManager } from '@kit.BasicServicesKit'; import { volumeManager } from '@kit.CoreFileKit'; import { BusinessError } from '@kit.BasicServicesKit'; let subscriber: commonEventManager.CommonEventSubscriber; async function example() { const subscribeInfo: commonEventManager.CommonEventSubscribeInfo = { events: [ "usual.event.data.VOLUME_REMOVED", "usual.event.data.VOLUME_UNMOUNTED", "usual.event.data.VOLUME_MOUNTED", "usual.event.data.VOLUME_BAD_REMOVAL", "usual.event.data.VOLUME_EJECT" ] }; subscriber = await commonEventManager.createSubscriber(subscribeInfo); } ``` 3. 收到广æ’通知åŽèŽ·å–å·è®¾å¤‡ä¿¡æ¯ã€‚ ```ts let subscriber: commonEventManager.CommonEventSubscriber|undefined; //注æ„: 傿•°subscriber 是从æ¥éª¤2订阅广æ’事件 ä¸ await commonEventManager.createSubscriber(subscribeInfo) 获å–到的。 if (subscriber !== undefined) { commonEventManager.subscribe(subscriber, (err: BusinessError, data: commonEventManager.CommonEventData) => { if (data.event === 'usual.event.data.VOLUME_MOUNTED' && data.parameters !== undefined) { // å¼€å‘者å¯ä»¥é€šè¿‡å¹¿æ’ä¼ é€’çš„å·è®¾å¤‡ä¿¡æ¯æ¥ç®¡ç†å·è®¾å¤‡ let volId: string = data.parameters.id; volumeManager.getVolumeById(volId, (error: BusinessError, vol: volumeManager.Volume) => { if (error) { console.error('volumeManager getVolumeById failed for ' + JSON.stringify(error)); } else { console.info('volumeManager getVolumeById successfully, the volume state is ' + vol.state); } }) } }) } ```