• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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