1# DRM系统管理(ArkTS)
2
3DRM系统管理(MediaKeySystem)支持MediaKeySystem实例管理、设备DRM证书申请与处理、会话实例管理、离线媒体密钥管理、获取DRM度量统计信息、设备属性等。在使用DRM Kit功能时,先查询设备是否支持对应DRM解决方案的DRM功能。在DRM Kit里DRM解决方案以插件形式存在,所以也叫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 '@kit.DrmKit';
13    ```
14
152. 导入BusinessError模块,用于获取drm模块相关接口抛出的错误码。
16
17    ```ts
18    import { BusinessError } from '@kit.BasicServicesKit';
19    ```
20
213. 查询设备是否支持对应的DRM解决方案。
22
23   > **说明:**
24   >
25   > 如果查询为false,说明该设备不支持对应的DRM解决方案。
26
27   ```ts
28   let isSupported: boolean = drm.isMediaKeySystemSupported("com.clearplay.drm", "video/avc", drm.ContentProtectionLevel.CONTENT_PROTECTION_LEVEL_SW_CRYPTO);
29   ```
30
314. (可选)获取设备上DRM解决方案的名称和唯一标识的列表。
32
33   > **说明:**
34   >
35   > 如果查询出的数组为空,说明该设备中不存在支持的DRM解决方案。
36
37   ```ts
38   let description: drm.MediaKeySystemDescription[] = drm.getMediaKeySystems();
39   ```
40
415. 创建MediaKeySystem实例。
42
43   > **说明:**
44   >
45   > 如果创建失败则返回undefined,说明该设备不支持DRM能力。
46
47   ```ts
48   let mediaKeySystem: drm.MediaKeySystem = drm.createMediaKeySystem("com.clearplay.drm");
49   ```
50
516. (可选)获取指定DRM解决方案名称对应的唯一标识。
52
53   > **说明:**
54   >
55   > 如果查询出的uuid的长度为0,说明该设备中不存在支持的DRM解决方案。
56
57   ```ts
58   let uuid: string = drm.getMediaKeySystemUuid("com.clearplay.drm");
59   ```
60
617. (可选)设置和获取DRM解决方案支持属性值。
62
63    ```ts
64    // DRM解决方案支持属性设置时,设置DRM解决方案支持的字符串类型的属性值
65    mediaKeySystem.setConfigurationString("configName", "configValue");
66    // 获取字符串类型的属性值
67    let configValueString : string = mediaKeySystem.getConfigurationString("version");
68    let configValueUint8ArrayA: Uint8Array = new Uint8Array([0x00, 0x00, 0x00, 0x00]);
69    // DRM解决方案支持属性设置时,设置DRM解决方案支持的字符数组类型的属性值
70    mediaKeySystem.setConfigurationByteArray("Uint8ArrayConfigName", configValueUint8ArrayA);
71    // 获取字符数组类型的属性值
72    let configValueUint8ArrayB: Uint8Array = mediaKeySystem.getConfigurationByteArray("Uint8ArrayConfigName");
73    ```
74
758. (可选)获取设备支持的最大内容保护级别。
76
77    ```ts
78    let contentProtectionLevel: drm.ContentProtectionLevel = drm.ContentProtectionLevel.CONTENT_PROTECTION_LEVEL_UNKNOWN;
79    try {
80      contentProtectionLevel = mediaKeySystem.getMaxContentProtectionLevel();
81    } catch (err) {
82      let error = err as BusinessError;
83      console.error(`getMaxContentProtectionLevel ERROR: ${error}`);
84    }
85    ```
86
879. 状态监听。
88
89    监听MediaKeySystem设备DRM证书请求事件。
90
91    通过注册的keySystemRequired回调函数监听设备DRM证书请求,MediaKeySystem创建成功时即可监听,需要设备DRM证书时触发。
92
93    ```ts
94    mediaKeySystem.on('keySystemRequired', (eventInfo: drm.EventInfo) => {
95      console.log('keySystemRequired' + 'extra:' + eventInfo.extraInfo + ' data:' + eventInfo.info);
96    });
97    ```
98
9910. (可选)获取设备DRM证书状态。
100
101    ```ts
102    let certificateStatus: drm.CertificateStatus = mediaKeySystem.getCertificateStatus();
103    ```
104
10511. 生成设备DRM证书请求。
106
107   DRM解决方案创建MediaKeySession会话时,如果没有设备DRM证书会触发DRM证书请求事件,此时,先获取设备上设备DRM证书状态,若设备上没有DRM证书或DRM证书状态异常(状态不是drm.CertificateStatus.CERT_STATUS_PROVISIONED),生成设备DRM证书请求。
108
109  ```ts
110    if(certificateStatus != drm.CertificateStatus.CERT_STATUS_PROVISIONED){
111      mediaKeySystem.generateKeySystemRequest().then(async (drmRequest: drm.ProvisionRequest) => {
112        console.info("generateKeySystemRequest success", drmRequest.data, drmRequest.defaultURL);
113      }).catch((err:BusinessError) =>{
114          console.info("generateKeySystemRequest err end", err.code);
115       });
116    } else {
117      console.info("The certificate already exists.");
118    }
119  ```
120
12112. 处理设备DRM证书响应。
122
123   在将设备DRM证书请求发送到DRM服务获取设备DRM证书请求响应后,处理设备DRM证书响应。
124
125  ```ts
126    // 将设备DRM证书请求返回的drmRequest.data通过网络请求发送给DRM证书服务获取设备DRM证书请求响应,设置设备DRM证书请求响应
127    let provisionResponseByte = new Uint8Array([0x00, 0x00, 0x00, 0x00]);
128    mediaKeySystem.processKeySystemResponse(provisionResponseByte).then(() => {
129      console.info("processKeySystemResponse success");
130    }).catch((err:BusinessError) =>{
131      console.info("processKeySystemResponse err end", err.code);
132    });
133  ```
134
13513. 创建MediaKeySession会话。
136
137    创建指定内容保护级别的MediaKeySession会话、或创建DRM解决方案默认内容保护级别的MediaKeySession会话。
138    ```ts
139    let mediaKeySession: drm.MediaKeySession = mediaKeySystem.createMediaKeySession();
140    ```
141
14214. (可选)获取离线媒体密钥标识列表,媒体密钥标识用于对离线媒体密钥的管理。
143
144    ```ts
145    let offlineMediaKeyIds: Uint8Array[] = mediaKeySystem.getOfflineMediaKeyIds();
146    ```
147
14815. (可选)获取离线媒体密钥状态。
149
150    ```ts
151    try {
152      let offlineMediaKeyStatus: drm.OfflineMediaKeyStatus = mediaKeySystem.getOfflineMediaKeyStatus(offlineMediaKeyIds[0]);
153    } catch (err) {
154      let error = err as BusinessError;
155      console.error(`getOfflineMediaKeyStatus ERROR: ${error}`);
156    }
157    ```
158
15916. (可选)移除离线媒体密钥。
160
161    ```ts
162    try {
163      mediaKeySystem.clearOfflineMediaKeys(offlineMediaKeyIds[0]);
164    } catch (err) {
165      let error = err as BusinessError;
166      console.error(`clearOfflineMediaKeys ERROR: ${error}`);
167    }
168    ```
169
17017. (可选)获取DRM度量记录,包括当前会话数、插件版本信息、解密次数和解密失败次数等。
171
172    ```ts
173    let statisticKeyValue: drm.StatisticKeyValue[] = mediaKeySystem.getStatistics();
174    ```
175
17618. 销毁MediaKeySession实例。
177
178    完成加密媒体解密,MediaKeySession实例不再使用时,销毁MediaKeySession实例。
179
180    ```ts
181    // MediaKeySession实例使用完需要进行资源释放
182    mediaKeySession.destroy();
183    ```
184
18519. 销毁MediaKeySystem实例。
186
187    完成DRM功能使用,MediaKeySystem实例不再使用,销毁MediaKeySystem实例。
188
189    ```ts
190    // MediaKeySystem实例使用完需要进行资源释放
191    mediaKeySystem.destroy();
192    ```