1e41f4b71Sopenharmony_ci# DRM Media Key Session Management (ArkTS) 2e41f4b71Sopenharmony_ci 3e41f4b71Sopenharmony_ciThe **MediaKeySystem** class of the DRM module supports media key management and media decryption. **MediaKeySession** instances are created and destroyed by **MediaKeySystem** instances. 4e41f4b71Sopenharmony_ci 5e41f4b71Sopenharmony_ci## How to Develop 6e41f4b71Sopenharmony_ci 7e41f4b71Sopenharmony_ciRead [DRM](../../reference/apis-drm-kit/js-apis-drm.md) for the API reference. 8e41f4b71Sopenharmony_ci 9e41f4b71Sopenharmony_ci1. Import the module. 10e41f4b71Sopenharmony_ci 11e41f4b71Sopenharmony_ci ```ts 12e41f4b71Sopenharmony_ci import { drm } from '@kit.DrmKit'; 13e41f4b71Sopenharmony_ci ``` 14e41f4b71Sopenharmony_ci 15e41f4b71Sopenharmony_ci2. Import the **BusinessError** module, which provides the error codes thrown by the APIs of the DRM module. 16e41f4b71Sopenharmony_ci 17e41f4b71Sopenharmony_ci ```ts 18e41f4b71Sopenharmony_ci import { BusinessError } from '@kit.BasicServicesKit'; 19e41f4b71Sopenharmony_ci ``` 20e41f4b71Sopenharmony_ci 21e41f4b71Sopenharmony_ci3. Listen for the session status. 22e41f4b71Sopenharmony_ci 23e41f4b71Sopenharmony_ci You can listen for the following events of a **MediaKeySession** instance: key request events, key expiry events, vendor-defined events, key update on expiry events, and key change events. 24e41f4b71Sopenharmony_ci 25e41f4b71Sopenharmony_ci - Listen for key request events, which are triggered when a media key is requested. 26e41f4b71Sopenharmony_ci 27e41f4b71Sopenharmony_ci ```ts 28e41f4b71Sopenharmony_ci mediaKeySession.on('keyRequired', (eventInfo: drm.EventInfo) => { 29e41f4b71Sopenharmony_ci console.log('keyRequired' + 'info:' + eventInfo.info + ' extraInfo:' + eventInfo.extraInfo); 30e41f4b71Sopenharmony_ci }); 31e41f4b71Sopenharmony_ci ``` 32e41f4b71Sopenharmony_ci 33e41f4b71Sopenharmony_ci - Listen for key expiry events, which are triggered when a media key expires. 34e41f4b71Sopenharmony_ci 35e41f4b71Sopenharmony_ci ```ts 36e41f4b71Sopenharmony_ci mediaKeySession.on('keyExpired', (eventInfo: drm.EventInfo) => { 37e41f4b71Sopenharmony_ci console.log('keyExpired' + 'info:' + eventInfo.info + ' extraInfo:' + eventInfo.extraInfo); 38e41f4b71Sopenharmony_ci }); 39e41f4b71Sopenharmony_ci ``` 40e41f4b71Sopenharmony_ci 41e41f4b71Sopenharmony_ci - Listen for vendor-defined events, which are triggered when a custom event of the DRM scheme occurs. 42e41f4b71Sopenharmony_ci 43e41f4b71Sopenharmony_ci ```ts 44e41f4b71Sopenharmony_ci mediaKeySession.on('vendorDefined', (eventInfo: drm.EventInfo) => { 45e41f4b71Sopenharmony_ci console.log('vendorDefined' + 'info:' + eventInfo.info + ' extraInfo:' + eventInfo.extraInfo); 46e41f4b71Sopenharmony_ci }); 47e41f4b71Sopenharmony_ci ``` 48e41f4b71Sopenharmony_ci 49e41f4b71Sopenharmony_ci - Listen for key update on expiry events, which are triggered when a media key updates upon expiry. 50e41f4b71Sopenharmony_ci 51e41f4b71Sopenharmony_ci ```ts 52e41f4b71Sopenharmony_ci mediaKeySession.on('expirationUpdate', (eventInfo: drm.EventInfo) => { 53e41f4b71Sopenharmony_ci console.log('expirationUpdate' + 'info:' + eventInfo.info + ' extraInfo:' + eventInfo.extraInfo); 54e41f4b71Sopenharmony_ci }); 55e41f4b71Sopenharmony_ci ``` 56e41f4b71Sopenharmony_ci 57e41f4b71Sopenharmony_ci - Listen for key change events, which are triggered when a media key is changed. 58e41f4b71Sopenharmony_ci 59e41f4b71Sopenharmony_ci ```ts 60e41f4b71Sopenharmony_ci mediaKeySession.on('keysChange', (keyInfo : drm.KeysInfo[], newKeyAvailable:boolean) => { 61e41f4b71Sopenharmony_ci for(let i = 0; i < keyInfo.length; i++){ 62e41f4b71Sopenharmony_ci console.log('keysChange' + 'info:' + keyInfo[i].keyId + ' extraInfo:' + keyInfo[i].value); 63e41f4b71Sopenharmony_ci } 64e41f4b71Sopenharmony_ci }); 65e41f4b71Sopenharmony_ci ``` 66e41f4b71Sopenharmony_ci 67e41f4b71Sopenharmony_ci4. Generate a media key request and process its response. 68e41f4b71Sopenharmony_ci 69e41f4b71Sopenharmony_ci ```ts 70e41f4b71Sopenharmony_ci let initData = new Uint8Array([0x00, 0x00, 0x00, 0x00]); 71e41f4b71Sopenharmony_ci // Set optional data based on the DRM scheme. 72e41f4b71Sopenharmony_ci let optionalData:drm.OptionsData[] = [{ 73e41f4b71Sopenharmony_ci name: "...", 74e41f4b71Sopenharmony_ci value: "..." 75e41f4b71Sopenharmony_ci }]; 76e41f4b71Sopenharmony_ci // The following example shows how to set an online media key request and response. 77e41f4b71Sopenharmony_ci mediaKeySession.generateMediaKeyRequest("video/avc", initData, drm.MediaKeyType.MEDIA_KEY_TYPE_ONLINE, optionalData).then(async (licenseRequest) => { 78e41f4b71Sopenharmony_ci console.info("generateMediaKeyRequest success", licenseRequest.mediaKeyRequestType, licenseRequest.data, licenseRequest.defaultURL); 79e41f4b71Sopenharmony_ci // Send licenseRequest.data returned by the media key request to the DRM service through a network request to obtain a response and process the response. 80e41f4b71Sopenharmony_ci let licenseResponse = new Uint8Array([0x00, 0x00, 0x00, 0x00]); 81e41f4b71Sopenharmony_ci mediaKeySession.processMediaKeyResponse(licenseResponse).then((mediaKeyId: Uint8Array) => { 82e41f4b71Sopenharmony_ci console.info("processMediaKeyResponse success"); 83e41f4b71Sopenharmony_ci }).catch((err:BusinessError) =>{ 84e41f4b71Sopenharmony_ci console.info("processMediaKeyResponse err end", err.code); 85e41f4b71Sopenharmony_ci }); 86e41f4b71Sopenharmony_ci }).catch((err:BusinessError) =>{ 87e41f4b71Sopenharmony_ci console.info("generateMediaKeyRequest err end", err.code); 88e41f4b71Sopenharmony_ci }); 89e41f4b71Sopenharmony_ci // The following example shows how to set an offline media key request and response. 90e41f4b71Sopenharmony_ci let offlineMediaKeyId = new Uint8Array([0x00, 0x00, 0x00, 0x00]); 91e41f4b71Sopenharmony_ci mediaKeySession.generateMediaKeyRequest("video/avc", initData, drm.MediaKeyType.MEDIA_KEY_TYPE_OFFLINE, optionalData).then((licenseRequest: drm.MediaKeyRequest) => { 92e41f4b71Sopenharmony_ci console.info("generateMediaKeyRequest success", licenseRequest.mediaKeyRequestType, licenseRequest.data, licenseRequest.defaultURL); 93e41f4b71Sopenharmony_ci // Send licenseRequest.data returned by the media key request to the DRM service through a network request to obtain a response and process the response. 94e41f4b71Sopenharmony_ci let licenseResponse = new Uint8Array([0x00, 0x00, 0x00, 0x00]); 95e41f4b71Sopenharmony_ci mediaKeySession.processMediaKeyResponse(licenseResponse).then((mediaKeyId: Uint8Array) => { 96e41f4b71Sopenharmony_ci offlineMediaKeyId = mediaKeyId; 97e41f4b71Sopenharmony_ci console.info("processMediaKeyResponse success"); 98e41f4b71Sopenharmony_ci }).catch((err:BusinessError) =>{ 99e41f4b71Sopenharmony_ci console.info("processMediaKeyResponse err end", err.code); 100e41f4b71Sopenharmony_ci }); 101e41f4b71Sopenharmony_ci }).catch((err:BusinessError) =>{ 102e41f4b71Sopenharmony_ci console.info("generateMediaKeyRequest err end", err.code); 103e41f4b71Sopenharmony_ci }); 104e41f4b71Sopenharmony_ci ``` 105e41f4b71Sopenharmony_ci 106e41f4b71Sopenharmony_ci5. (Optional) Check the media key status of the media key session. 107e41f4b71Sopenharmony_ci 108e41f4b71Sopenharmony_ci ```ts 109e41f4b71Sopenharmony_ci try { 110e41f4b71Sopenharmony_ci let keyvalue: drm.MediaKeyStatus[] = mediaKeySession.checkMediaKeyStatus(); 111e41f4b71Sopenharmony_ci console.info("checkMediaKeyStatus success", keyvalue[0].value); 112e41f4b71Sopenharmony_ci } catch (err) { 113e41f4b71Sopenharmony_ci let error = err as BusinessError; 114e41f4b71Sopenharmony_ci console.error(`checkMediaKeyStatus ERROR: ${error}`); 115e41f4b71Sopenharmony_ci } 116e41f4b71Sopenharmony_ci ``` 117e41f4b71Sopenharmony_ci 118e41f4b71Sopenharmony_ci6. (Optional) Generate an offline media key release request and process its response. 119e41f4b71Sopenharmony_ci 120e41f4b71Sopenharmony_ci ```ts 121e41f4b71Sopenharmony_ci mediaKeySession.generateOfflineReleaseRequest(offlineMediaKeyId).then((OfflineReleaseRequest: Uint8Array) => { 122e41f4b71Sopenharmony_ci console.info("generateOfflineReleaseRequest success", OfflineReleaseRequest); 123e41f4b71Sopenharmony_ci // Send OfflineReleaseRequest returned by the offline media key release request to the DRM service through a network request to obtain a response and process the response. 124e41f4b71Sopenharmony_ci let OfflineReleaseResponse = new Uint8Array([0x00, 0x00, 0x00, 0x00]); 125e41f4b71Sopenharmony_ci mediaKeySession.processOfflineReleaseResponse(offlineMediaKeyId, OfflineReleaseResponse).then(() => { 126e41f4b71Sopenharmony_ci console.info("processOfflineReleaseResponse success"); 127e41f4b71Sopenharmony_ci }).catch((err:BusinessError) =>{ 128e41f4b71Sopenharmony_ci console.info("processOfflineReleaseResponse err end", err.code); 129e41f4b71Sopenharmony_ci }); 130e41f4b71Sopenharmony_ci }).catch((err:BusinessError) =>{ 131e41f4b71Sopenharmony_ci console.info("generateOfflineReleaseRequest err end", err.code); 132e41f4b71Sopenharmony_ci }); 133e41f4b71Sopenharmony_ci ``` 134e41f4b71Sopenharmony_ci 135e41f4b71Sopenharmony_ci7. (Optional) Restore offline media keys. 136e41f4b71Sopenharmony_ci 137e41f4b71Sopenharmony_ci ```ts 138e41f4b71Sopenharmony_ci // Restore the specified media key information to the media key session. 139e41f4b71Sopenharmony_ci mediaKeySession.restoreOfflineMediaKeys(offlineMediaKeyId).then(() => { 140e41f4b71Sopenharmony_ci console.log("restoreOfflineMediaKeys success."); 141e41f4b71Sopenharmony_ci }).catch((err: BusinessError) => { 142e41f4b71Sopenharmony_ci console.error(`restoreOfflineMediaKeys: ERROR: ${err}`); 143e41f4b71Sopenharmony_ci }); 144e41f4b71Sopenharmony_ci ``` 145e41f4b71Sopenharmony_ci 146e41f4b71Sopenharmony_ci8. (Optional) Obtain the content protection level of the media key session. 147e41f4b71Sopenharmony_ci 148e41f4b71Sopenharmony_ci ```ts 149e41f4b71Sopenharmony_ci try { 150e41f4b71Sopenharmony_ci let contentProtectionLevel: drm.ContentProtectionLevel = mediaKeySession.getContentProtectionLevel(); 151e41f4b71Sopenharmony_ci } catch (err) { 152e41f4b71Sopenharmony_ci let error = err as BusinessError; 153e41f4b71Sopenharmony_ci console.error(`getContentProtectionLevel ERROR: ${error}`); 154e41f4b71Sopenharmony_ci } 155e41f4b71Sopenharmony_ci ``` 156e41f4b71Sopenharmony_ci 157e41f4b71Sopenharmony_ci9. (Optional) Check whether secure decoding is required. 158e41f4b71Sopenharmony_ci 159e41f4b71Sopenharmony_ci ```ts 160e41f4b71Sopenharmony_ci try { 161e41f4b71Sopenharmony_ci let status: boolean = mediaKeySession.requireSecureDecoderModule("video/avc"); 162e41f4b71Sopenharmony_ci } catch (err) { 163e41f4b71Sopenharmony_ci let error = err as BusinessError; 164e41f4b71Sopenharmony_ci console.error(`requireSecureDecoderModule ERROR: ${error}`); 165e41f4b71Sopenharmony_ci } 166e41f4b71Sopenharmony_ci ``` 167e41f4b71Sopenharmony_ci 168e41f4b71Sopenharmony_ci10. (Optional) Clear the media keys of the media key session. 169e41f4b71Sopenharmony_ci 170e41f4b71Sopenharmony_ci ```ts 171e41f4b71Sopenharmony_ci try { 172e41f4b71Sopenharmony_ci mediaKeySession.clearMediaKeys(); 173e41f4b71Sopenharmony_ci } catch (err) { 174e41f4b71Sopenharmony_ci let error = err as BusinessError; 175e41f4b71Sopenharmony_ci console.error(`clearMediaKeys ERROR: ${error}`); 176e41f4b71Sopenharmony_ci } 177e41f4b71Sopenharmony_ci ``` 178