1# 会话管理(ArkTS) 2 3DRM会话管理(MediaKeySession)支持MediaKeySession实例管理、许可证申请与处理等。 4 5## 开发步骤 6 7详细的API说明请参考[DRM API参考](../../reference/apis-drm-kit/js-apis-drm.md)。 8 91. 导入相关接口,导入方法如下。 10 11 ```ts 12 import drm from '@ohos.multimedia.drm'; 13 ``` 14 152. 调用MediaKeySession类中的generateMediaKeyRequest方法,生成许可证请求。接口调用失败时,会返回相应错误码,错误码类型参见[DrmErrorCode](../../reference/apis-drm-kit/js-apis-drm.md#drmerrorcode)。 16 17 ```ts 18 function generateMediaKeyRequest(mimeType: string, initData: Uint8Array, mediakeyType: number, optionalData: OptionalData[]): Promise<MediaKeyRequest> { 19 let mediaKeysystem: drm.mediaKeySystem = drm.createMediaKeySystem("com.clearplay.drm"); 20 let mediaKeySession: drm.MediaKeySession = mediaKeysystem.createMediaKeySession(); 21 var uint8pssh = new Uint8Array([0x00, 0x00, 0x00, 0x00]); 22 var optionalData = [ 23 {name : "optionalDataNameA", value : "optionalDataValueA"}, 24 {name : "optionalDataNameB", value : "optionalDataValueB"}, 25 ]; 26 mediaKeySession.generateMediaKeyRequest(mimeType, initData, mediakeyType, optionalData).then((mediaKeyRequest: drm.MediaKeyRequest) =>{ 27 console.log('generateMediaKeyRequest' + mediaKeyRequest); 28 }).catch((err: BusinessError) => { 29 console.error(`generateMediaKeyRequest: ERROR: ${err}`); 30 }); 31 return mediaKeyRequest; 32 } 33 ``` 34 353. 调用MediaKeySession类中的processMediaKeyResponse方法,处理许可证响应报文。接口调用失败时,会返回相应错误码,错误码类型参见[DrmErrorCode](../../reference/apis-drm-kit/js-apis-drm.md#drmerrorcode)。 36 37 ```ts 38 function processMediaKeyResponse(response: Uint8Array): Promise<Uint8Array> { 39 let mediaKeysystem: drm.mediaKeySystem = drm.createMediaKeySystem("com.clearplay.drm"); 40 let mediaKeySession: drm.MediaKeySession = mediaKeysystem.createMediaKeySession(); 41 mediaKeySession.processMediaKeyResponse(response).then((mediaKeyId: Uint8Array) => { 42 console.log('processMediaKeyResponse:' + mediaKeyId); 43 }).catch((err: BusinessError) => { 44 console.error(`processMediaKeyResponse: ERROR: ${err}`); 45 }); 46 return mediaKeyId; 47 } 48 ``` 49 504. 调用MediaKeySession类中的checkMediaKeyStatus方法,检查当前会话的许可证状态。接口调用失败时,会返回相应错误码,错误码类型参见[DrmErrorCode](../../reference/apis-drm-kit/js-apis-drm.md#drmerrorcode)。 51 52 ```ts 53 function checkMediaKeyStatus(): MediaKeyStatus[] { 54 let mediaKeysystem: drm.mediaKeySystem = drm.createMediaKeySystem("com.clearplay.drm"); 55 let mediaKeySession: drm.MediaKeySession = mediaKeysystem.createMediaKeySession(); 56 try { 57 let mediakeyStatus: drm.MediaKeyStatus[] = mediaKeySession.checkMediaKeyStatus(); 58 } catch (err) { 59 let error = err as BusinessError; 60 console.error(`checkMediaKeyStatus ERROR: ${error}`); 61 } 62 return mediakeyStatus; 63 } 64 ``` 65 665. 调用MediaKeySession类中的clearMediaKeys方法,删除当前会话的许可证。接口调用失败时,会返回相应错误码,错误码类型参见[DrmErrorCode](../../reference/apis-drm-kit/js-apis-drm.md#drmerrorcode)。 67 68 ```ts 69 function clearMediaKeys(): void { 70 let mediaKeysystem: drm.mediaKeySystem = drm.createMediaKeySystem("com.clearplay.drm"); 71 let mediaKeySession: drm.MediaKeySession = mediaKeysystem.createMediaKeySession(); 72 try { 73 mediaKeySession.clearMediaKeys(); 74 } catch (err) { 75 let error = err as BusinessError; 76 console.error(`clearMediaKeys ERROR: ${error}`); 77 } 78 } 79 ``` 80 816. 调用MediaKeySession类中的generateOfflineReleaseRequest方法,生成离线许可证释放请求。接口调用失败会返回相应错误码,错误码类型参见[DrmErrorCode](../../reference/apis-drm-kit/js-apis-drm.md#drmerrorcode)。 82 83 ```ts 84 function generateOfflineReleaseRequest(mediakeyId: Uint8Array): Promise<Uint8Array> { 85 let mediaKeysystem: drm.mediaKeySystem = drm.createMediaKeySystem("com.clearplay.drm"); 86 let mediaKeySession: drm.MediaKeySession = mediaKeysystem.createMediaKeySession(); 87 var offlineReleaseRequest = new Uint8Array([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]); 88 mediaKeySession.processMediaKeyResponse(offlineReleaseRequest).then((mediaKeyId: Uint8Array) => { 89 console.log('processMediaKeyResponse:' + mediaKeyId); 90 }).catch((err: BusinessError) => { 91 console.error(`processMediaKeyResponse: ERROR: ${err}`); 92 }); 93 mediaKeySession.generateOfflineReleaseRequest(offlineMediaKeyId).then((offlineReleaseRequest: Uint8Array) => { 94 console.log('generateOfflineReleaseRequest:' + offlineReleaseRequest); 95 }).catch((err: BusinessError) => { 96 console.error(`generateOfflineReleaseRequest: ERROR: ${err}`); 97 }); 98 return offlineReleaseRequest; 99 } 100 ``` 101 1027. 处理离线许可证释放响应。 103 104 调用MediaKeySession类中的processOfflineReleaseResponse方法,处理离线许可证释放响应。接口调用失败会返回相应错误码,错误码类型参见[DrmErrorCode](../../reference/apis-drm-kit/js-apis-drm.md#drmerrorcode)。 105 106 ```ts 107 function processOfflineReleaseResponse(response: Uint8Array): Promise<void> { 108 let mediaKeysystem: drm.mediaKeySystem = drm.createMediaKeySystem("com.clearplay.drm"); 109 let mediaKeySession: drm.MediaKeySession = mediaKeysystem.createMediaKeySession(); 110 var offlineReleaseRequest = new Uint8Array([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]); 111 mediaKeySession.processMediaKeyResponse(offlineReleaseRequest).then((mediaKeyId: Uint8Array) => { 112 console.log('processMediaKeyResponse:' + mediaKeyId); 113 }).catch((err: BusinessError) => { 114 console.error(`processMediaKeyResponse: ERROR: ${err}`); 115 }); 116 mediaKeySession.processOfflineReleaseResponse(offlineMediaKeyId, response).then(() => { 117 console.log('processOfflineReleaseResponse:'); 118 }).catch((err: BusinessError) => { 119 console.error(`processOfflineReleaseResponse: ERROR: ${err}`); 120 }); 121 } 122 ``` 123 1248. 恢复离线许可证。 125 126 调用MediaKeySession类中的restoreOfflineMediaKeys方法,恢复离线许可证。接口调用失败会返回相应错误码,错误码类型参见[DrmErrorCode](../../reference/apis-drm-kit/js-apis-drm.md#drmerrorcode)。 127 128 ```ts 129 function restoreOfflineMediaKeys(mediakeyId: Uint8Array): Promise<void> { 130 let mediaKeysystem: drm.mediaKeySystem = drm.createMediaKeySystem("com.clearplay.drm"); 131 let mediaKeySession: drm.MediaKeySession = mediaKeysystem.createMediaKeySession(); 132 var response = new Uint8Array([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]); 133 mediaKeySession.processOfflineReleaseResponse(mediakeyId, response).then(() => { 134 console.log('processOfflineReleaseResponse'); 135 }).catch((err: BusinessError) => { 136 console.error(`processOfflineReleaseResponse: ERROR: ${err}`); 137 }); 138 mediaKeySession.restoreOfflineMediaKey(mediakeyId).then(() => { 139 console.log("restoreOfflineMediaKeys"); 140 }).catch((err: BusinessError) => { 141 console.error(`restoreOfflineMediaKeys: ERROR: ${err}`); 142 }); 143 } 144 ``` 145 1469. 获取当前会话的安全级别。 147 148 调用MediaKeySession类中的getContentProtectionLevel方法,获取当前会话的安全级别。接口调用失败会返回相应错误码,错误码类型参见[DrmErrorCode](../../reference/apis-drm-kit/js-apis-drm.md#drmerrorcode)。 149 150 ```ts 151 function getContentProtectionLevel(): ContentProtectionLevel { 152 let mediaKeysystem: drm.mediaKeySystem = drm.createMediaKeySystem("com.clearplay.drm"); 153 let mediaKeySession: drm.MediaKeySession = mediaKeysystem.createMediaKeySession(); 154 try { 155 let contentProtectionLevel: drm.ContentProtectionLevel = mediaKeySession.getContentProtectionLevel(); 156 } catch (err) { 157 let error = err as BusinessError; 158 console.error(`clearMediaKeys ERROR: ${error}`); 159 } 160 return contentProtectionLevel; 161 } 162 ``` 163 16410. 查询安全解码模块状态。 165 166 调用MediaKeySession类中的requireSecureDecoderModule方法,查询安全解码模块状态。接口调用失败会返回相应错误码,错误码类型参见[DrmErrorCode](../../reference/apis-drm-kit/js-apis-drm.md#drmerrorcode)。 167 168 ```ts 169 function requireSecureDecoderModule(mimeType: string): boolean { 170 let mediaKeysystem: drm.mediaKeySystem = drm.createMediaKeySystem("com.clearplay.drm"); 171 let mediaKeySession: drm.MediaKeySession = mediaKeysystem.createMediaKeySession(); 172 try { 173 let status: boolean = mediaKeySession.requireSecureDecoderModule(mimeType); 174 } catch (err) { 175 let error = err as BusinessError; 176 console.error(`clearMediaKeys ERROR: ${error}`); 177 } 178 return status; 179 } 180 ``` 181 18211. 销毁MediaKeySession实例。 183 184 调用MediaKeySession类中的destroy方法,销毁MediaKeySession实例。接口调用失败会返回相应错误码,错误码类型参见[DrmErrorCode](../../reference/apis-drm-kit/js-apis-drm.md#drmerrorcode)。 185 186 ```ts 187 function destroy(mediaKeySession: MediaKeySession): void { 188 mediaKeySession.destroy(); 189 return; 190 } 191 ``` 192 19312. 状态监听。 194 195 在播放器应用开发过程中,可以随时监听MediaKeySession信息状态,包括密钥请求事件监听、密钥过期事件监听、第三方自定义事件监听、密钥过期更新事件监听、密钥变化事件监听。 196 197 - 通过注册固定的keyRequired回调函数获取监听设备证书请求,MediaKeySession创建成功时即可监听,有该事件返回结果则认为设备证书请求开始,不需要监听的时候使用off进行注销监听。 198 199 ```ts 200 function onRegisterkeyRequired(mediaKeysession: drm.MediaKeysession): void { 201 mediaKeysession.on('keyRequired', (eventInfo: EventInfo) => { 202 console.log('keyRequired' + 'info:' + eventInfo.info + ' extraInfo:' + eventInfo.extraInfo); 203 }); 204 return; 205 } 206 ``` 207 208 ```ts 209 function unregisterkeyRequired(mediaKeysession: drm.MediaKeysession): void { 210 mediaKeysession.off('keyRequired'); 211 return; 212 } 213 ``` 214 215 - 通过注册固定的keyExpired回调函数获取监听密钥过期事件,MediaKeySession创建成功时即可监听,不需要监听的时候使用off进行注销监听。 216 217 ```ts 218 function onRegisterkeyExpired(mediaKeysession: drm.MediaKeysession): void { 219 mediaKeysession.on('keyExpired', (eventInfo: EventInfo) => { 220 console.log('keyExpired' + 'info:' + eventInfo.info + ' extraInfo:' + eventInfo.extraInfo); 221 }); 222 return; 223 } 224 ``` 225 226 ```ts 227 function unRegisterkeyExpired(mediaKeysession: drm.MediaKeysession): void { 228 mediaKeysession.off('keyExpired'); 229 return; 230 } 231 ``` 232 233 - 通过注册固定的vendorDefined回调函数获取监听第三方自验证事件,MediaKeySession创建成功时即可监听,不需要监听的时候使用off进行注销监听。 234 235 ```ts 236 function onRegisterVendorDefined(mediaKeysession: drm.MediaKeysession): void { 237 mediaKeysession.on('vendorDefined', (eventInfo: EventInfo) => { 238 console.log('vendorDefined' + 'info:' + eventInfo.info + ' extraInfo:' + eventInfo.extraInfo); 239 }); 240 return; 241 } 242 ``` 243 244 ```ts 245 function unRegisterVendorDefined(mediaKeysession: drm.MediaKeysession): void { 246 mediaKeysession.off('vendorDefined'); 247 return; 248 } 249 ``` 250 251 - 通过注册固定的expirationUpdated回调函数获取监听过期更新事件,MediaKeySession创建成功时即可监听,不需要监听的时候使用off进行注销监听。 252 253 ```ts 254 function onRegisterExpirationUpdated(mediaKeysession: drm.MediaKeysession): void { 255 mediaKeysession.on('expirationUpdate', (eventInfo: EventInfo) => { 256 console.log('expirationUpdate' + 'info:' + eventInfo.info + ' extraInfo:' + eventInfo.extraInfo); 257 }); 258 return; 259 } 260 ``` 261 262 ```ts 263 function unRegisterExpirationUpdated(mediaKeysession: drm.MediaKeysession): void { 264 mediaKeysession.off('expirationUpdate'); 265 return; 266 } 267 ``` 268 269 - 通过注册固定的keyChanged回调函数获取监听密钥变化事件,MediaKeySession创建成功时即可监听,不需要监听的时候使用off进行注销监听。 270 271 ```ts 272 function onRegisterKeyChanged(mediaKeysession: drm.MediaKeysession): void { 273 mediaKeysession.on('keysChange', (eventInfo: EventInfo) => { 274 console.log('keysChange' + 'info:' + eventInfo.info + ' extraInfo:' + eventInfo.extraInfo); 275 }); 276 return; 277 } 278 ``` 279 280 ```ts 281 function unRegisterKeyChanged(mediaKeysession: drm.MediaKeysession): void { 282 mediaKeysession.off('keysChange'); 283 return; 284 } 285 ``` 286