1# 系统管理(ArkTS) 2 3DRM系统管理(MediaKeySystem)支持MediaKeySystem实例管理、设备证书申请与处理、会话创建、离线许可证管理、获取DRM度量统计信息、设备属性等。 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. 调用MediaKeySystem类中的setConfigurationString方法,设置当前设备支持的字符串类型的属性值。接口调用失败时,会返回相应错误码,错误码类型参见[DrmErrorCode](../../reference/apis-drm-kit/js-apis-drm.md#drmerrorcode)。 16 17 ```ts 18 function setConfigurationString(configName: string, value: string): void { 19 let mediaKeysystem: drm.mediaKeySystem = drm.createMediaKeySystem("com.clearplay.drm"); 20 try { 21 mediaKeysystem.setConfigurationString(configName, value); 22 } catch (err) { 23 let error = err as BusinessError; 24 console.error(`setConfigurationString ERROR: ${error}`); 25 } 26 return ; 27 } 28 ``` 29 303. 调用MediaKeySystem类中的getConfigurationString方法,获取字符串类型的设备相关设备属性。接口调用失败时,会返回相应错误码,错误码类型参见[DrmErrorCode](../../reference/apis-drm-kit/js-apis-drm.md#drmerrorcode)。 31 32 ```ts 33 function getConfigurationString(configName: string): string { 34 let mediaKeysystem: drm.mediaKeySystem = drm.createMediaKeySystem("com.clearplay.drm"); 35 try { 36 let configValue: string = mediaKeysystem.getConfigurationString(configName); 37 } catch (err) { 38 let error = err as BusinessError; 39 console.error(`getConfigurationString ERROR: ${error}`); 40 } 41 return configValue; 42 } 43 ``` 44 454. 调用MediaKeySystem类中的setConfigurationByteArray方法,设置当前设备支持的字符数组类型的属性值。接口调用失败时,会返回相应错误码,错误码类型参见[DrmErrorCode](../../reference/apis-drm-kit/js-apis-drm.md#drmerrorcode)。 46 47 ```ts 48 function setConfigurationByteArray(configName: string, value: Uint8Array): void { 49 let mediaKeysystem: drm.mediaKeySystem = drm.createMediaKeySystem("com.clearplay.drm"); 50 try { 51 mediaKeysystem.setConfigurationByteArray(configName, value); 52 } catch (err) { 53 let error = err as BusinessError; 54 console.error(`setConfigurationByteArray ERROR: ${error}`); 55 } 56 return; 57 } 58 ``` 59 605. 调用MediaKeySystem类中的getConfigurationByteArray方法,获取字符数组类型的设备相关设备属性值。接口调用失败时,会返回相应错误码,错误码类型参见[DrmErrorCode](../../reference/apis-drm-kit/js-apis-drm.md#drmerrorcode)。 61 62 ```ts 63 function getConfigurationByteArray(configName: string): Uint8Array { 64 let mediaKeysystem: drm.mediaKeySystem = drm.createMediaKeySystem("com.clearplay.drm"); 65 try { 66 let configValue: Uint8Array = mediaKeysystem.getConfigurationByteArray(configName); 67 } catch (err) { 68 let error = err as BusinessError; 69 console.error(`getConfigurationByteArray ERROR: ${error}`); 70 } 71 return configValue; 72 } 73 ``` 74 756. 调用MediaKeySystem类中的getMetrics()方法,获取系统统计信息。其中包括当前会话数、插件版本信息、解密次数和解密失败次数。接口调用失败会返回相应错误码,错误码类型参见[DrmErrorCode](../../reference/apis-drm-kit/js-apis-drm.md#drmerrorcode)。 76 77 ```ts 78 function getStatistics(): StatisticKeyValue[] { 79 try { 80 let statisticKeyValue: StatisticKeyValue[] = mediaKeysystem.getStatistics(); 81 } catch (err) { 82 let error = err as BusinessError; 83 console.error(`getConfigurationByteArray ERROR: ${error}`); 84 } 85 return statisticKeyValue; 86 } 87 ``` 88 897. 获取设备最大安全级别。 90 91 调用MediaKeySystem类中的getMaxContentProtectionLevel方法,获取设备支持的安全级别。接口调用失败会返回相应错误码,错误码类型参见[DrmErrorCode](../../reference/apis-drm-kit/js-apis-drm.md#drmerrorcode)。 92 93 ```ts 94 function getMaxContentProtectionLevel(): ContentProtectionLevel { 95 try { 96 let contentProtectionLevel: drm.ContentProtectionLevel = mediaKeysystem.getMaxContentProtectionLevel(); 97 } catch (err) { 98 let error = err as BusinessError; 99 console.error(`getConfigurationByteArray ERROR: ${error}`); 100 } 101 return contentProtectionLevel; 102 } 103 ``` 104 1058. 生成设备证书请求。 106 107 调用MediaKeySystem类中的generateKeySystemRequest方法,获取设备证书请求。接口调用失败会返回相应错误码,错误码类型参见[DrmErrorCode](../../reference/apis-drm-kit/js-apis-drm.md#drmerrorcode)。 108 109 ```ts 110 function generateKeySystemRequest(): Promise<ProvisionRequest> { 111 generateKeySystemRequest().then((ProvisionRequest: drm.ProvisionRequest) => { 112 console.log("generateKeySystemRequest"); 113 }).catch((err: BusinessError) => { 114 console.error(`generateKeySystemRequest: ERROR: ${err}`); 115 }); 116 return provisionRequest; 117 } 118 ``` 119 1209. 处理设备证书响应。 121 122 调用MediaKeySystem类中的processKeySystemResponse方法,处理设备证书响应。接口调用失败会返回相应错误码,错误码类型参见[DrmErrorCode](../../reference/apis-drm-kit/js-apis-drm.md#drmerrorcode)。 123 124 ```ts 125 function processKeySystemResponse(response: Uint8Array): Promise<void> { 126 processKeySystemResponse(response).then(() => { 127 console.log("processKeySystemResponse"); 128 }).catch((err: BusinessError) => { 129 console.error(`processKeySystemResponse: ERROR: ${err}`); 130 }); 131 return; 132 } 133 ``` 134 13510. 获取设备证书状态。 136 137 调用MediaKeySystem类中的getCertificateStatus方法,获取设备证书状态。接口调用失败会返回相应错误码,错误码类型参见[DrmErrorCode](../../reference/apis-drm-kit/js-apis-drm.md#drmerrorcode)。 138 139 ```ts 140 function getCertificateStatus(): CertificateStatus { 141 try { 142 let certificateStatus: drm.CertificateStatus = mediaKeysystem.getCertificateStatus(); 143 } catch (err) { 144 let error = err as BusinessError; 145 console.error(`getCertificateStatus ERROR: ${error}`); 146 } 147 return certificateStatus; 148 } 149 ``` 150 15111. 创建DRM会话。 152 153 调用MediaKeySystem类中的createMediaKeySession方法,按指定安全级别进行创建会话。接口调用失败会返回相应错误码,错误码类型参见[DrmErrorCode](../../reference/apis-drm-kit/js-apis-drm.md#drmerrorcode)。 154 155 ```ts 156 function createMediaKeySession(level: ContentProtectionLevel): MediaKeySession { 157 try { 158 let mediaKeySession: drm.MediaKeySession = mediaKeysystem.createMediaKeySession(drm.level.CONTENT_PROTECTION_LEVEL_SW_CRYPTO); 159 } catch (err) { 160 let error = err as BusinessError; 161 console.error(`getCertificateStatus ERROR: ${error}`); 162 } 163 return mediaKeySession; 164 } 165 ``` 166 16712. 创建DRM会话。 168 169 调用MediaKeySystem类中的createMediaKeySession方法,创建会话。接口调用失败会返回相应错误码,错误码类型参见[DrmErrorCode](../../reference/apis-drm-kit/js-apis-drm.md#drmerrorcode)。 170 171 ```ts 172 function createMediaKeySession(): MediaKeySession { 173 try { 174 let mediaKeySession: drm.MediaKeySession = mediaKeysystem.createMediaKeySession(); 175 } catch (err) { 176 let error = err as BusinessError; 177 console.error(`getCertificateStatus ERROR: ${error}`); 178 } 179 return mediaKeySession; 180 } 181 ``` 182 18313. 获取离线许可证Id。 184 185 调用MediaKeySystem类中的getOfflineMediaKeyIds方法,获取离线许可证Id。接口调用失败会返回相应错误码,错误码类型参见[DrmErrorCode](../../reference/apis-drm-kit/js-apis-drm.md#drmerrorcode)。 186 187 ```ts 188 function getOfflineMediaKeyIds(): Uint8Array[] { 189 try { 190 let offlineMediaKeyIds: Uint8Array[] = mediaKeysystem.getOfflineMediaKeyIds(); 191 } catch (err) { 192 let error = err as BusinessError; 193 console.error(`getOfflineMediaKeyIds ERROR: ${error}`); 194 } 195 return offlineMediaKeyIds; 196 } 197 ``` 198 19914. 获取离线许可证状态。 200 201 调用MediaKeySystem类中的getOfflineMediaKeyStatus方法,获取离线许可证状态。接口调用失败会返回相应错误码,错误码类型参见[DrmErrorCode](../../reference/apis-drm-kit/js-apis-drm.md#drmerrorcode)。 202 203 ```ts 204 function getOfflineMediaKeyStatus(mediakeyId: Uint8Array): OfflineMediaKeyStatus { 205 try { 206 let offlineMediaKeyStatus: drm.OfflineMediaKeyStatus = mediaKeysystem.getOfflineMediaKeyStatus(mediakeyId); 207 } catch (err) { 208 let error = err as BusinessError; 209 console.error(`getOfflineMediaKeyStatus ERROR: ${error}`); 210 } 211 return offlineMediaKeyStatus; 212 } 213 ``` 214 21515. 移除离线许可证。 216 217 调用MediaKeySystem类中的clearOfflineMediaKeys方法,移除离线许可证。接口调用失败会返回相应错误码,错误码类型参见[DrmErrorCode](../../reference/apis-drm-kit/js-apis-drm.md#drmerrorcode)。 218 219 ```ts 220 function clearOfflineMediaKeys(mediakeyId: Uint8Array): void { 221 try { 222 mediaKeysystem.clearOfflineMediaKeys(mediakeyId); 223 } catch (err) { 224 let error = err as BusinessError; 225 console.error(`clearOfflineMediaKeys ERROR: ${error}`); 226 } 227 return; 228 } 229 ``` 230 23116. 销毁MediaKeySystem实例。 232 233 调用MediaKeySystem类中的destroy方法,销毁MediaKeySystem实例。接口调用失败会返回相应错误码,错误码类型参见[DrmErrorCode](../../reference/apis-drm-kit/js-apis-drm.md#drmerrorcode)。 234 235 ```ts 236 function destroy(mediaKeySyste: MediaKeySyste): void { 237 try { 238 mediaKeysystem.destroy(); 239 } catch (err) { 240 let error = err as BusinessError; 241 console.error(`mediaKeysystem destroy ERROR: ${error}`); 242 } 243 return; 244 } 245 ``` 246 24717. 状态监听。 248 249 在播放器应用开发过程中,可以随时监听MediaKeySystem信息状态,包括设备证书请求事件监听。 250 251 - 通过注册固定的keySystemRequired回调函数获取监听设备证书请求,MediaKeySystem创建成功时即可监听,有该事件返回结果则认为设备证书请求开始,不需要监听的时候使用off进行注销监听。 252 253 ```ts 254 function onRegisterkeySystemRequired(mediaKeysystem: drm.MediaKeySystem): void { 255 mediaKeysystem.on('keySystemRequired', (eventInfo: EventInfo) => { 256 console.log('keySystemRequired' + 'extra:' + eventInfo.extraInfo + ' data:' + eventInfo.info); 257 }); 258 } 259 ``` 260 261 ```ts 262 function unregisterkeySystemRequired(mediaKeysystem: drm.MediaKeySystem): void { 263 mediaKeysystem.off('keySystemRequired'); 264 } 265 ``` 266 267