已合并
新增场景配置服务Kit简介、术语及评估管理开发指南、API参考、错误码 #163989
weredust创建于 9月8日
新增场景配置服务Kit简介、术语及评估管理开发指南、API参考、错误码 #163989
已合并
weredust创建于 9月8日
共 8 个文件变更+991-0
@@ -0,0 +1,11 @@
1+# Automatic Scene Configuration Kit(场景配置服务)
2+<!--Kit: Automatic Scene Configuration Kit-->
3+<!--Subsystem: Customization-->
4+<!--Owner: @weredust-->
5+<!--Designer: @weredust-->
6+<!--Tester: @weredust-->
7+<!--Adviser: @weredust-->
8+ 
W
Wweredust28 天前

需要补充Kit相关指南

likedislike
weredust
28 天前 评论:
9+- [Automatic Scene Configuration Kit简介](assessment-kit-intro.md)
10+- [评估管理开发指南](assessment-guide.md)
11+- [Automatic Scene Configuration Kit术语](assessment-glossary.md)
@@ -0,0 +1,37 @@
1+# Automatic Scene Configuration Kit术语
2+ 
3+<!--Kit: Automatic Scene Configuration Kit-->
4+<!--Subsystem: Customization-->
5+<!--Owner: @weredust-->
6+<!--Designer: @weredust-->
7+<!--Tester: @weredust-->
8+<!--Adviser: @weredust-->
9+ 
10+本文介绍Automatic Scene Configuration Kit相关术语。
11+ 
12+## A
13+ 
14+### allowedApps;应用白名单
15+评估配置中用于指定评估期间允许运行的应用包名集合。不在白名单内的应用在评估期间无法运行。
16+ 
17+### Assessment Mode;评估模式
18+开始评估后,系统对部分系统能力进行限制的运行状态,用于防止用户作弊或泄露评估内容。评估模式经用户在确认弹窗中确认后进入,通过结束评估或评估被中断退出。
19+ 
20+### AssessmentConfig;评估配置
21+调用begin接口时传入的配置信息,包含评估最大时长duration与应用白名单allowedApps两个字段。
22+ 
23+### AssessmentErrorCode;评估错误码
24+表示评估操作结果与评估中断原因的枚举,成员包括OK、USER_CANCEL、TIMEOUT、SYSTEM_ERROR、ENV_ANOMALY。
25+ 
26+### AssessmentInterruptInfo;评估中断信息
27+评估被中断时通过onInterrupted回调传入的信息,包含中断原因码code与中断原因的详细描述message。
28+ 
29+## D
30+ 
31+### duration;评估最大时长
32+评估配置中用于指定本次评估最长持续时间的字段,单位为毫秒,取值存在上限。取值为0时按默认时长处理,默认时长与上限一致。达到评估最大时长后评估被中断,中断原因码为TIMEOUT。
33+ 
34+## I
35+ 
36+### IAssessmentCallback;评估回调
37+调用begin接口时注册的回调接口,用于接收评估过程事件,包含评估开始的onBegin、评估中断的onInterrupted与评估结束的onEnd三个方法。
@@ -0,0 +1,381 @@
1+# 评估管理开发指南
2+ 
3+<!--Kit: Automatic Scene Configuration Kit-->
4+<!--Subsystem: Customization-->
5+<!--Owner: @weredust-->
6+<!--Designer: @weredust-->
7+<!--Tester: @weredust-->
8+<!--Adviser: @weredust-->
9+ 
10+## 功能介绍
11+ 
12+本文指导开发者接入评估管理能力,完成开始评估、查询评估状态与结束评估的开发。Kit级能力范围与约束参见[Automatic Scene Configuration Kit简介](assessment-kit-intro.md),名词定义参见[Automatic Scene Configuration Kit术语](assessment-glossary.md)。
13+ 
14+评估管理模块提供以下能力:
15+ 
16+- 开始评估:调用begin接口发起评估,系统弹出确认弹窗,用户确认后设备进入评估模式。可通过评估配置指定评估最大时长与评估期间允许运行的应用白名单。
17+- 结束评估:调用end接口结束评估,系统解除评估模式下对系统能力的限制。
18+- 评估状态查询与配置获取:调用isActive接口查询当前是否处于评估状态,调用getConfiguration接口获取当前评估配置。
19+- 评估过程回调:通过IAssessmentCallback接收评估开始(onBegin)、评估中断(onInterrupted)、评估结束(onEnd)事件。
20+ 
21+## 约束与限制
22+ 
23+进入评估模式后设备功能被大幅限制,为防止第三方应用滥用该能力,调用评估管理接口需申请权限[ohos.permission.ASSESSMENT_CONFIGURATION](../security/AccessToken/restricted-permissions.md#ohospermissionassessment_configuration)。
24+ 
25+**表1** 权限信息
26+ 
27+| 权限名 | 权限级别 | 授权方式 | 应用开放范围 |
28+| -------- | -------- | -------- | -------- |
29+| ohos.permission.ASSESSMENT_CONFIGURATION | system_basic | 系统授权(system_grant) | 普通应用 |
30+ 
31+该权限属于受限权限,需经审批后应用才可获得,申请方式参见[申请受限权限](../security/AccessToken/declare-permissions-in-acl.md)。审批需同时满足以下规则:
32+ 
33+1. 应用主体为企业、教育机构或正规考试服务商,不支持个人账号申请。
34+2. 应用在应用市场的二级分类属于教育类。
35+3. 应用核心用途为高风险正式考试或测评类场景(如学业水平考试、职业认证、标准化测验),不用于普通课堂练习、打卡、签到、刷题、录屏监控等场景,申请时需提供考试场景的页面截图。
36+4. 应用无历史违规,开发者账号无严重审核违规、欺诈、作弊记录。
37+ 
38+其他约束如下:
39+ 
40+- 开始评估需经用户在确认弹窗中确认,用户取消则评估不会开始。
41+- 同一设备同一时间仅允许存在一个进行中的评估,已处于评估状态时再次调用begin接口会报错。
42+- 仅开启评估的应用可结束该评估,调用end接口结束其他应用开启的评估会报错。
43+ 
44+评估配置的规格约束如下:
45+ 
46+- duration最大值为8小时(28800000毫秒),超出该值的取值按上限生效;取值为0时按默认时长8小时处理。
47+- allowedApps最多支持配置20个应用包名,且所有包名拼接后的总长度不超过2048字符。
48+ 
49+## 开发流程
50+ 
51+1. 在配置文件中申请权限ohos.permission.ASSESSMENT_CONFIGURATION。
52+2. 导入评估管理模块。
53+3. 配置评估参数,调用begin接口开始评估,并注册评估过程回调。
54+4. 根据业务需要,调用isActive、getConfiguration接口查询评估状态和配置。
55+5. 评估完成后,调用end接口结束评估。
56+ 
57+## 接口说明
58+ 
59+评估管理关键接口如下表所示,具体API说明详见[@ohos.customization.assessment (评估管理)](../reference/apis-assessment-kit/js-apis-customization-assessment.md)。
60+ 
61+**表2** 评估管理接口功能介绍
62+ 
63+| 接口名 | 描述 |
64+| -------- | -------- |
65+| [begin(context, config, callback)](../reference/apis-assessment-kit/js-apis-customization-assessment.md#assessmentbegin): void | 开始评估,弹出确认弹窗,用户确认后进入评估模式。 |
66+| [end(context)](../reference/apis-assessment-kit/js-apis-customization-assessment.md#assessmentend): void | 结束评估,解除评估模式下的系统能力限制。 |
67+| [isActive()](../reference/apis-assessment-kit/js-apis-customization-assessment.md#assessmentisactive): boolean | 查询当前是否处于评估状态。 |
68+| [getConfiguration()](../reference/apis-assessment-kit/js-apis-customization-assessment.md#assessmentgetconfiguration): AssessmentConfig | 获取当前评估配置。 |
69+ 
70+## 开发步骤
71+ 
72+### 申请权限
73+ 
74+在模块的module.json5文件中,申请权限[ohos.permission.ASSESSMENT_CONFIGURATION](../security/AccessToken/restricted-permissions.md#ohospermissionassessment_configuration)。该权限为system_basic级别的系统授权(system_grant)受限权限,需先按[申请受限权限](../security/AccessToken/declare-permissions-in-acl.md)完成申请,声明后在应用安装时自动授予。声明权限的详细说明参见[声明权限](../security/AccessToken/declare-permissions.md)。示例如下:
75+ 
76+```json5
77+{
78+ "module": {
79+ "requestPermissions": [
80+ {
81+ "name": "ohos.permission.ASSESSMENT_CONFIGURATION"
82+ }
83+ ]
84+ }
85+}
86+```
87+ 
88+### 导入评估管理模块
89+ 
90+导入assessment模块后即可调用评估管理接口。
91+ 
92+```ts
93+import { assessment } from '@kit.AutomaticSceneConfigurationKit';
94+```
95+ 
96+### 开始评估
97+ 
98+配置评估参数,调用begin接口开始评估,并通过IAssessmentCallback注册评估过程回调。
99+ 
100+调用begin后,系统会弹出确认弹窗,需用户确认后方可开始评估,评估结果及评估过程中的中断、结束事件均通过回调通知。context的获取方式参见[Context的获取方式](../application-models/application-context-stage.md#context的获取方式)。示例代码如下:
101+ 
102+```ts
103+import { common } from '@kit.AbilityKit';
104+import { assessment } from '@kit.AutomaticSceneConfigurationKit';
105+import { BusinessError } from '@kit.BasicServicesKit';
106+import { hilog } from '@kit.PerformanceAnalysisKit';
107+ 
108+const DOMAIN: number = 0xFF00;
109+const TAG: string = '[Sample_Assessment]';
110+ 
111+// 评估过程回调
112+const assessmentCallback: assessment.IAssessmentCallback = {
113+ onBegin: (error: assessment.AssessmentError): void => {
114+ // AssessmentError.message为可选字段,取值前先做空值兜底
115+ const message: string = error.message ?? '';
116+ if (error.code === assessment.AssessmentErrorCode.OK) {
117+ hilog.info(DOMAIN, TAG, '%{public}s', `onBegin, assessment began successfully, message: ${message}`);
118+ } else {
119+ hilog.error(DOMAIN, TAG, '%{public}s',
120+ `onBegin, assessment begin failed, code: ${error.code}, message: ${message}`);
121+ }
122+ },
123+ onInterrupted: (info: assessment.AssessmentInterruptInfo): void => {
124+ // 评估被中断,业务侧可根据中断原因码做相应处理,如保存答题记录
125+ hilog.warn(DOMAIN, TAG, '%{public}s', `onInterrupted, code: ${info.code}, message: ${info.message}`);
126+ },
127+ onEnd: (): void => {
128+ hilog.info(DOMAIN, TAG, '%{public}s', 'onEnd, assessment ended');
129+ }
130+};
131+ 
132+@Entry
133+@Component
134+struct Index {
135+ build() {
136+ Button('开始评估')
137+ .onClick(() => {
138+ this.beginAssessment();
139+ })
140+ }
141+ 
142+ private beginAssessment(): void {
143+ // 请在组件内获取context,确保this.getUIContext().getHostContext()返回结果为UIAbilityContext
144+ const host: common.Context | undefined = this.getUIContext().getHostContext();
145+ if (host === undefined) {
146+ hilog.error(DOMAIN, TAG, '%{public}s', 'begin failed, the host context is undefined');
147+ return;
148+ }
149+ const context: common.UIAbilityContext = host as common.UIAbilityContext;
150+ // 评估配置:最大时长1小时(3600000毫秒);
151+ // 评估期间允许运行包名为com.samples.assessment的应用
152+ const config: assessment.AssessmentConfig = {
153+ duration: 3600000,
154+ allowedApps: ['com.samples.assessment']
155+ };
156+ try {
157+ assessment.begin(context, config, assessmentCallback);
158+ hilog.info(DOMAIN, TAG, '%{public}s', 'begin called, waiting for user confirmation');
159+ } catch (error) {
160+ const err: BusinessError = error as BusinessError;
161+ hilog.error(DOMAIN, TAG, '%{public}s', `begin failed, code: ${err.code}, message: ${err.message}`);
162+ }
163+ }
164+}
165+```
166+ 
167+### 查询评估状态与配置
168+ 
169+在评估过程中,调用isActive接口查询当前评估状态,调用getConfiguration接口获取当前评估配置。示例代码如下:
170+ 
171+```ts
172+import { assessment } from '@kit.AutomaticSceneConfigurationKit';
173+import { BusinessError } from '@kit.BasicServicesKit';
174+import { hilog } from '@kit.PerformanceAnalysisKit';
175+ 
176+const DOMAIN: number = 0xFF00;
177+const TAG: string = '[Sample_Assessment]';
178+ 
179+try {
180+ const active: boolean = assessment.isActive();
181+ hilog.info(DOMAIN, TAG, '%{public}s', `isActive result: ${active}`);
182+ if (active) {
183+ const config: assessment.AssessmentConfig = assessment.getConfiguration();
184+ hilog.info(DOMAIN, TAG, '%{public}s',
185+ `getConfiguration result, duration: ${config.duration}, allowedApps: ${config.allowedApps.join(',')}`);
186+ }
187+} catch (error) {
188+ const err: BusinessError = error as BusinessError;
189+ hilog.error(DOMAIN, TAG, '%{public}s', `query failed, code: ${err.code}, message: ${err.message}`);
190+}
191+```
192+ 
193+### 结束评估
194+ 
195+评估完成后,由开启评估的应用调用end接口结束评估,系统解除评估模式下对系统能力的限制,并触发onEnd回调。示例代码如下:
196+ 
197+```ts
198+import { common } from '@kit.AbilityKit';
199+import { assessment } from '@kit.AutomaticSceneConfigurationKit';
200+import { BusinessError } from '@kit.BasicServicesKit';
201+import { hilog } from '@kit.PerformanceAnalysisKit';
202+ 
203+const DOMAIN: number = 0xFF00;
204+const TAG: string = '[Sample_Assessment]';
205+ 
206+@Entry
207+@Component
208+struct Index {
209+ build() {
210+ Button('交卷')
211+ .onClick(() => {
212+ this.endAssessment();
213+ })
214+ }
215+ 
216+ // 结束由当前应用开启的评估,仅开启评估的应用可以结束该评估
217+ private endAssessment(): void {
218+ // 请在组件内获取context,确保this.getUIContext().getHostContext()返回结果为UIAbilityContext
219+ const host: common.Context | undefined = this.getUIContext().getHostContext();
220+ if (host === undefined) {
221+ hilog.error(DOMAIN, TAG, '%{public}s', 'end failed, the host context is undefined');
222+ return;
223+ }
224+ const context: common.UIAbilityContext = host as common.UIAbilityContext;
225+ try {
226+ assessment.end(context);
227+ hilog.info(DOMAIN, TAG, '%{public}s', 'end called');
228+ } catch (error) {
229+ const err: BusinessError = error as BusinessError;
230+ hilog.error(DOMAIN, TAG, '%{public}s', `end failed, code: ${err.code}, message: ${err.message}`);
231+ }
232+ }
233+}
234+```
235+ 
236+## 应用侧加固建议
237+ 
238+评估模式由系统统一管控部分系统能力,但应用窗口形态、应用窗口的截屏录屏、剪切板与输入法面板不在系统管控范围内,需由应用自行加固,防止评估内容外泄或借助外部输入作弊。建议在进入评估页面时统一启用,退出评估页面时恢复。
239+ 
240+**表3** 应用侧加固措施
241+ 
242+| 加固措施 | 接口 | 作用 |
243+| -------- | -------- | -------- |
244+| 窗口沉浸式 | setWindowLayoutFullScreen | 内容延伸至状态栏与导航栏区域,减少评估页面外的系统入口暴露 |
245+| 隐私模式 | setWindowPrivacyMode | 窗口无法被截屏与录屏,退至后台时在多任务视图中显示为隐私遮罩 |
246+| 清空剪切板 | clearData | 清除残留的剪切板数据,避免借助剪切板传入答案 |
247+| 简单键盘模式 | setSimpleKeyboardEnabled | 输入法面板仅保留基础按键,收起候选栏与扩展功能入口 |
248+ 
249+隐私模式需申请权限ohos.permission.PRIVACY_WINDOW,该权限为normal级别的系统授权(system_grant)权限,声明方式与[申请权限](#申请权限)一致。窗口类接口需先获取当前窗口,加固与恢复的关键实现如下:
250+ 
251+```ts
252+import { common } from '@kit.AbilityKit';
253+import { window } from '@kit.ArkUI';
254+import { BusinessError, pasteboard } from '@kit.BasicServicesKit';
255+import { inputMethod } from '@kit.IMEKit';
256+import { hilog } from '@kit.PerformanceAnalysisKit';
257+ 
258+const DOMAIN: number = 0xFF00;
259+const TAG: string = '[Sample_Assessment]';
260+ 
261+export class ExamHardeningUtil {
262+ // 进入评估页面时启用全部加固措施
263+ public static async applyHardening(context: common.UIAbilityContext): Promise<void> {
264+ await ExamHardeningUtil.setWindowHardening(context, true);
265+ ExamHardeningUtil.setSimpleKeyboard(true);
266+ await ExamHardeningUtil.clearPasteboard();
267+ }
268+ 
269+ // 退出评估页面时恢复窗口形态与输入法,并再次清空剪切板
270+ public static async releaseHardening(context: common.UIAbilityContext): Promise<void> {
271+ await ExamHardeningUtil.setWindowHardening(context, false);
272+ ExamHardeningUtil.setSimpleKeyboard(false);
273+ await ExamHardeningUtil.clearPasteboard();
274+ }
275+ 
276+ // 两项窗口措施分别捕获异常,单项失败不影响另一项生效
277+ private static async setWindowHardening(context: common.UIAbilityContext, enable: boolean): Promise<void> {
278+ let currentWindow: window.Window | undefined = undefined;
279+ try {
280+ currentWindow = await window.getLastWindow(context);
281+ } catch (error) {
282+ const err: BusinessError = error as BusinessError;
283+ hilog.error(DOMAIN, TAG, '%{public}s', `getLastWindow failed, code: ${err.code}, message: ${err.message}`);
284+ }
285+ if (currentWindow === undefined) {
286+ return;
287+ }
288+ try {
289+ await currentWindow.setWindowLayoutFullScreen(enable);
290+ } catch (error) {
291+ const err: BusinessError = error as BusinessError;
292+ hilog.error(DOMAIN, TAG, '%{public}s',
293+ `setWindowLayoutFullScreen failed, code: ${err.code}, message: ${err.message}`);
294+ }
295+ try {
296+ await currentWindow.setWindowPrivacyMode(enable);
297+ } catch (error) {
298+ const err: BusinessError = error as BusinessError;
299+ hilog.error(DOMAIN, TAG, '%{public}s',
300+ `setWindowPrivacyMode failed, code: ${err.code}, message: ${err.message}`);
301+ }
302+ }
303+ 
304+ // setSimpleKeyboard调用inputMethod.setSimpleKeyboardEnabled,
305+ // clearPasteboard调用pasteboard.getSystemPasteboard().clearData,两者同样单独捕获异常
306+ // ...
307+}
308+```
309+ 
310+在评估页面的生命周期中调用加固与恢复,示例代码如下:
311+ 
312+```ts
313+aboutToAppear(): void {
314+ this.applyHardening();
315+}
316+ 
317+aboutToDisappear(): void {
318+ this.releaseHardening();
319+}
320+ 
321+private applyHardening(): void {
322+ const context: common.UIAbilityContext | undefined = this.getAbilityContext();
323+ if (context === undefined) {
324+ return;
325+ }
326+ ExamHardeningUtil.applyHardening(context).catch((error: BusinessError) => {
327+ hilog.error(DOMAIN, TAG, '%{public}s', `applyHardening failed, code: ${error.code}, message: ${error.message}`);
328+ });
329+}
330+```
331+ 
332+完整实现参见[相关实例](#相关实例)。
333+ 
334+## 调测验证
335+ 
336+1. 调用begin接口后,设备弹出评估确认弹窗;用户确认后进入评估模式,系统能力受到限制,onBegin回调返回code为0(OK)。
337+ 
338+2. 调用isActive接口,返回true,表示当前处于评估状态。
339+ 
340+3. 尝试打开allowedApps白名单之外的应用,验证其无法在评估期间运行。
341+ 
342+4. 调用end接口结束评估,isActive接口返回false,系统能力限制解除,onEnd回调被触发。
343+ 
344+## 常见问题
345+ 
346+### 如何设计allowedApps白名单以保证评估期间业务可用
347+ 
348+allowedApps用于指定评估期间允许运行的应用包名,白名单之外的应用在评估期间无法运行。设计白名单时建议遵循以下原则:
349+ 
350+- 将评估过程中必须使用的应用加入白名单,如答题应用依赖的输入法、无障碍辅助应用,以及听力评估所需的音频播放应用。
351+- 必须将发起评估的应用自身包名加入allowedApps。调用begin时该应用处于前台,若不在白名单内,开始评估前的环境校验不通过,评估无法开始。
352+ 
353+白名单的具体规格限制参见[约束与限制](#约束与限制),配置方式参见[开始评估](#开始评估)。
354+ 
355+### duration取值为0时评估如何退出
356+ 
357+duration为0时系统按默认时长处理,该默认时长与duration上限一致,达到该时长后评估因超时被中断并触发onInterrupted回调,中断原因码为TIMEOUT。具体取值参见[约束与限制](#约束与限制)。
358+ 
359+评估期间也可随时由开启评估的应用调用end接口主动结束评估,系统解除对系统能力的限制并触发onEnd回调。为避免评估长时间占用设备,建议按业务实际作答时长设置duration,具体操作参见[结束评估](#结束评估)。
360+ 
361+### 评估被中断后应用需要做哪些处理
362+ 
363+onEnd与onInterrupted的触发时机不同:onEnd在应用调用end接口正常结束评估后触发;onInterrupted在评估被系统主动中断时触发,携带中断原因码与描述信息。
364+ 
365+评估被中断时系统已自动解除对系统能力的限制,应用无需再调用end接口,建议完成以下处理:
366+ 
367+- 在onInterrupted回调中保存答题记录、剩余时长等业务数据,避免数据丢失。
368+- 根据中断原因码区分处理,如超时退出时提交已作答内容,用户取消时提示用户评估已结束。
369+- 中断后如需重新评估,重新调用begin接口发起,并由用户在确认弹窗中确认。
370+ 
371+### 为什么调用begin后没有立即进入评估模式
372+ 
373+begin接口调用成功后不会立即进入评估模式。系统会先弹出确认弹窗,需用户在弹窗中确认后设备才进入评估模式,用户取消则评估不会开始。
374+ 
375+begin接口返回仅表示请求已提交,评估是否真正开始需通过onBegin回调判断:回调中code为OK表示评估已开始,为USER_CANCEL表示用户已取消。建议在onBegin回调中再更新界面状态并启动业务计时,配置方式参见[开始评估](#开始评估)。
376+ 
377+## 相关实例
378+ 
379+针对评估管理开发,有以下相关实例可供参考:
380+ 
381+- [评估管理(ArkTS)](https://gitcode.com/openharmony/applications_app_samples/tree/master/code/DocsSample/AutomaticSceneConfigurationKit/Assessment)
@@ -0,0 +1,41 @@
1+# Automatic Scene Configuration Kit简介
2+ 
3+<!--Kit: Automatic Scene Configuration Kit-->
4+<!--Subsystem: Customization-->
5+<!--Owner: @weredust-->
6+<!--Designer: @weredust-->
7+<!--Tester: @weredust-->
8+<!--Adviser: @weredust-->
9+ 
10+从API version 26.1.0开始,Automatic Scene Configuration Kit(场景配置服务)为应用提供场景化的系统能力配置与管控能力,由系统在系统侧实施配置与管控,应用无需自行实现拦截逻辑,也无法绕过或自行解除限制。本Kit当前由评估管理(assessment)模块承载上述能力,面向线上考试、培训测评等需要保障过程公平的业务场景,管控全程需用户确认或可被用户感知。
11+ 
12+## 使用场景
13+ 
14+- 线上正式考试:在学业水平考试、招生入学考试等正式考试场景中,限制作答期间设备的部分系统能力,防止作弊与试题泄露。
15+- 职业认证与标准化测验:在职业资格认证、语言能力测验等标准化测验场景中,为所有考生提供一致的受限作答环境,保障成绩可比。
16+- 培训测评:在企业培训、课程结业测评等场景中,限制与测评无关的应用运行,帮助参与者专注完成测评。
17+ 
18+## 能力范围
19+ 
20+- 评估管理:提供评估场景的开始与结束、评估状态查询与评估配置获取、评估过程事件回调,以及评估期间通知受限等系统能力管控。开发详情参见[评估管理开发指南](assessment-guide.md),接口详情参见[@ohos.customization.assessment (评估管理)](../reference/apis-assessment-kit/js-apis-customization-assessment.md)。
21+ 
22+## 亮点/特征
23+ 
24+- **系统侧统一管控**:场景内的系统能力限制由系统在系统侧统一实施,不依赖应用自身实现,应用无法绕过,也无法自行解除。
25+- **管控全程需用户确认或可被用户感知**:进入管控前由系统弹出确认弹窗征得用户同意,用户取消则管控不生效,管控解除后设备恢复正常状态。
26+- **管控状态与中断原因可回调感知**:应用通过回调获取场景开始、中断与结束事件,中断事件携带原因码与描述信息。
27+ 
28+## 约束与限制
29+ 
30+- 本Kit能力仅可在Stage模型下使用。
31+- 支持设备:Phone | PC/2in1 | Tablet。
32+- 调用本Kit能力需申请受限权限,权限信息、审批规则与模块级规格参见[评估管理开发指南](assessment-guide.md#约束与限制)。
33+ 
34+## 与相关Kit的关系
35+ 
36+- [Ability Kit](../application-models/abilitykit-overview.md):本Kit依赖Ability Kit提供的应用模型与上下文能力,仅支持Stage模型应用,场景配置请求需由具备UIAbility上下文的应用发起。
37+- [Notification Kit](../notification/notification-overview.md):场景管控生效期间通知受限,包括无铃声、震动与横幅等,该限制由系统侧统一实施,本Kit不单独提供通知相关接口。
38+ 
39+## 与开发指南的关系
40+ 
41+本文说明Automatic Scene Configuration Kit是什么、提供哪些模块与Kit级约束;[评估管理开发指南](assessment-guide.md)说明评估管理模块怎么做,含模块级约束与限制、开发流程、接口说明、示例代码、调测验证与常见问题;[Automatic Scene Configuration Kit术语](assessment-glossary.md)统一本文档集的名词定义;接口签名与错误码参见`../reference/apis-assessment-kit/`下的[@ohos.customization.assessment (评估管理)](../reference/apis-assessment-kit/js-apis-customization-assessment.md)与[评估管理错误码](../reference/apis-assessment-kit/errorcode-assessment.md)。
@@ -0,0 +1,12 @@
1+# Automatic Scene Configuration Kit(场景配置服务)
2+<!--Kit: Automatic Scene Configuration Kit-->
3+<!--Subsystem: Customization-->
4+<!--Owner: @weredust-->
5+<!--Designer: @weredust-->
6+<!--Tester: @weredust-->
7+<!--Adviser: @weredust-->
8+ 
9+- ArkTS API<!--assessment-arkts-->
10+ - [@ohos.customization.assessment (评估管理)](js-apis-customization-assessment.md)
11+- 错误码<!--assessment-arkts-errcode-->
12+ - [评估管理错误码](errorcode-assessment.md)
@@ -0,0 +1,88 @@
1+# 评估管理错误码
2+ 
3+<!--Kit: Automatic Scene Configuration Kit-->
4+<!--Subsystem: Customization-->
5+<!--Owner: @weredust-->
6+<!--Designer: @weredust-->
7+<!--Tester: @weredust-->
8+<!--Adviser: @weredust-->
9+ 
10+> **说明:**
11+>
12+> 以下仅介绍本模块特有错误码,通用错误码请参考[通用错误码说明文档](../errorcode-universal.md)。
13+ 
14+## 36700001 评估内部错误
15+ 
16+**错误信息**
17+ 
18+Assessment internal error. Possible cause: IPC invocation failed internally.
19+ 
20+**错误描述**
21+ 
22+调用begin或end接口时,评估配置服务发生内部错误,操作失败,系统会产生此错误码。
23+ 
24+**可能原因**
25+ 
26+评估配置服务内部IPC调用失败。
27+ 
28+**处理步骤**
29+ 
30+重新调用接口尝试。若多次重试仍失败,请检查评估配置服务运行状态,或联系设备厂商技术支持。
31+ 
32+## 36700002 评估配置服务已处于活动状态
33+ 
34+**错误信息**
35+ 
36+Assessment configuration service is already active. Possible cause: Assessment resource conflict.
37+ 
38+**错误描述**
39+ 
40+设备已处于评估状态时,再次调用begin接口,评估资源冲突,无法重复开始评估,系统会产生此错误码。
41+ 
42+**可能原因**
43+ 
44+1. 当前应用上一次评估尚未结束,再次调用begin接口开始新的评估。
45+ 
46+2. 其他应用已开启评估且尚未结束。
47+ 
48+**处理步骤**
49+ 
50+1. 调用isActive接口查询当前评估状态。若返回true,先调用end接口结束当前评估,再开始新的评估。
51+ 
52+2. 确认是否有其他应用已开启评估且尚未结束。如有,需由开启评估的应用调用end接口结束评估后,再开始新的评估。
53+ 
54+## 36700003 评估配置服务未处于活动状态
55+ 
56+**错误信息**
57+ 
58+Assessment configuration service is not active. Possible cause: Not in assessment state.
59+ 
60+**错误描述**
61+ 
62+设备未处于评估状态时调用end接口,系统会产生此错误码。
63+ 
64+**可能原因**
65+ 
66+当前不存在进行中的评估,调用了end接口。
67+ 
68+**处理步骤**
69+ 
70+调用isActive接口确认当前评估状态,仅在返回true时调用end接口结束评估。
71+ 
72+## 36700004 非法操作
73+ 
74+**错误信息**
75+ 
76+Invalid operation. Possible cause: Cannot terminate another active assessment.
77+ 
78+**错误描述**
79+ 
80+调用end接口时,尝试结束非本应用开启的评估,系统会产生此错误码。
81+ 
82+**可能原因**
83+ 
84+当前进行中的评估由其他应用开启,本应用无权结束该评估。
85+ 
86+**处理步骤**
87+ 
88+确认评估的开启方,由开启评估的应用调用end接口结束评估。
@@ -0,0 +1,420 @@
1+# @ohos.customization.assessment (评估管理)
2+ 
3+<!--Kit: Automatic Scene Configuration Kit-->
4+<!--Subsystem: Customization-->
5+<!--Owner: @weredust-->
6+<!--Designer: @weredust-->
7+<!--Tester: @weredust-->
8+<!--Adviser: @weredust-->
9+ 
10+评估管理模块提供评估场景管理能力,包括开始评估、结束评估、评估状态查询、评估配置获取以及评估过程中的回调等。当应用需要进入考试场景时,可调用begin接口开始评估,系统将弹窗提醒用户,用户确认进入评估模式后会限制部分系统能力,防止用户考试作弊或泄密;评估结束或被中断后,可调用end接口退出评估模式,在保障考试公平的同时保护用户权益。
11+ 
12+**起始版本:** 26.1.0
13+ 
14+## 导入模块
15+ 
16+```ts
17+import { assessment } from '@kit.AutomaticSceneConfigurationKit';
18+```
19+ 
20+## AssessmentConfig
21+ 
22+评估场景配置信息。
23+ 
24+**起始版本:** 26.1.0
25+ 
26+**模型约束**:此接口仅可在Stage模型下使用。
27+ 
28+**系统能力**:SystemCapability.Customization.AssessmentConfiguration
29+ 
30+| 名称 | 类型 | 只读 | 可选 | 说明 |
31+| -------- | -------- | -------- | -------- | -------- |
32+| duration | int | 否 | 否 | 评估最大时长,单位为毫秒,取值范围为0~28800000(即0~8小时),超过8小时的取值按8小时生效。取值为0时按默认时长8小时处理。 |
33+| allowedApps | Array\<string\> | 否 | 否 | 评估期间允许运行的应用包名列表(白名单)。最多支持配置20个包名,且所有包名拼接后的总长度不超过2048字符。 |
34+ 
35+## AssessmentErrorCode
36+ 
37+评估错误码的枚举。
38+ 
39+**起始版本:** 26.1.0
40+ 
41+**模型约束**:此接口仅可在Stage模型下使用。
42+ 
43+**系统能力**:SystemCapability.Customization.AssessmentConfiguration
44+ 
45+| 名称 | 值 | 说明 |
46+| -------- | -------- | -------- |
47+| OK | 0 | 表示成功。 |
48+| USER_CANCEL | 1 | 表示用户取消。 |
49+| TIMEOUT | 2 | 表示超时退出。 |
50+| SYSTEM_ERROR | 3 | 表示系统错误。 |
51+| ENV_ANOMALY | 4 | 表示环境异常。 |
52+ 
53+## AssessmentError
54+ 
55+评估错误信息。
56+ 
57+**起始版本:** 26.1.0
58+ 
59+**模型约束**:此接口仅可在Stage模型下使用。
60+ 
61+**系统能力**:SystemCapability.Customization.AssessmentConfiguration
62+ 
63+| 名称 | 类型 | 只读 | 可选 | 说明 |
64+| -------- | -------- | -------- | -------- | -------- |
65+| code | [AssessmentErrorCode](#assessmenterrorcode) | 否 | 否 | 错误码。0表示成功,非0表示失败。 |
66+| message | string | 否 | 是 | 错误描述信息。可选字段,未提供时默认为空字符串。 |
67+ 
68+## AssessmentInterruptInfo
69+ 
70+评估中断信息。
71+ 
72+**起始版本:** 26.1.0
73+ 
74+**模型约束**:此接口仅可在Stage模型下使用。
75+ 
76+**系统能力**:SystemCapability.Customization.AssessmentConfiguration
77+ 
78+| 名称 | 类型 | 只读 | 可选 | 说明 |
79+| -------- | -------- | -------- | -------- | -------- |
80+| code | [AssessmentErrorCode](#assessmenterrorcode) | 否 | 否 | 中断原因码。 |
81+| message | string | 否 | 否 | 中断原因的详细描述信息。 |
82+ 
83+## IAssessmentCallback
84+ 
85+评估过程回调接口,用于接收评估开始、中断、结束事件的回调。
86+ 
87+**起始版本:** 26.1.0
88+ 
89+**模型约束**:此接口仅可在Stage模型下使用。
90+ 
91+**系统能力**:SystemCapability.Customization.AssessmentConfiguration
92+ 
93+### onBegin
94+ 
95+onBegin(error: AssessmentError): void
96+ 
97+评估开始时的回调。
98+ 
99+**起始版本:** 26.1.0
100+ 
101+**模型约束**:此接口仅可在Stage模型下使用。
102+ 
103+**系统能力**:SystemCapability.Customization.AssessmentConfiguration
104+ 
105+**参数:**
106+ 
107+| 参数名 | 类型 | 必填 | 说明 |
108+| -------- | -------- | -------- | -------- |
109+| error | [AssessmentError](#assessmenterror) | 是 | 评估错误信息。code为0(OK)表示评估开始成功,非0表示评估开始失败。 |
110+ 
111+### onInterrupted
112+ 
113+onInterrupted(info: AssessmentInterruptInfo): void
114+ 
115+评估被中断时的回调。当评估过程因用户取消、超时退出、系统错误、安全违规等原因被中断时触发。
116+ 
117+**起始版本:** 26.1.0
118+ 
119+**模型约束**:此接口仅可在Stage模型下使用。
120+ 
121+**系统能力**:SystemCapability.Customization.AssessmentConfiguration
122+ 
123+**参数:**
124+ 
125+| 参数名 | 类型 | 必填 | 说明 |
126+| -------- | -------- | -------- | -------- |
127+| info | [AssessmentInterruptInfo](#assessmentinterruptinfo) | 是 | 评估中断信息,包括中断原因码和中断原因的详细描述信息。 |
128+ 
129+### onEnd
130+ 
131+onEnd(): void
132+ 
133+评估结束时的回调。
134+ 
135+**起始版本:** 26.1.0
136+ 
137+**模型约束**:此接口仅可在Stage模型下使用。
138+ 
139+**系统能力**:SystemCapability.Customization.AssessmentConfiguration
140+ 
141+## assessment.begin
142+ 
143+begin(context: UIAbilityContext, config: AssessmentConfig, callback: IAssessmentCallback): void
144+ 
145+开始评估。调用后会弹出确认弹窗,需用户确认后方可开始评估。评估结果及评估过程中的中断、结束事件通过callback回调通知。
146+ 
147+**起始版本:** 26.1.0
148+ 
149+**模型约束**:此接口仅可在Stage模型下使用。
150+ 
151+**需要权限**:ohos.permission.ASSESSMENT_CONFIGURATION
152+ 
153+**系统能力**:SystemCapability.Customization.AssessmentConfiguration
154+ 
155+**参数:**
156+ 
157+| 参数名 | 类型 | 必填 | 说明 |
158+| -------- | -------- | -------- | -------- |
159+| context | [UIAbilityContext](../apis-ability-kit/js-apis-inner-application-uiAbilityContext.md) | 是 | 需要进入评估模式的应用上下文。 |
160+| config | [AssessmentConfig](#assessmentconfig) | 是 | 评估配置信息,包括评估最大时长、评估期间允许运行的应用白名单。 |
161+| callback | [IAssessmentCallback](#iassessmentcallback) | 是 | 评估过程回调,用于接收评估开始、中断、结束事件。 |
162+ 
163+**错误码:**
164+ 
165+以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[评估管理错误码](errorcode-assessment.md)。
166+ 
167+| 错误码ID | 错误信息 |
168+| -------- | -------- |
169+| 201 | Permission denied. |
170+| 801 | Capability not supported. |
171+| 36700001 | Assessment internal error. Possible cause: IPC invocation failed internally. |
172+| 36700002 | Assessment configuration service is already active. Possible cause: Assessment resource conflict. |
173+ 
174+**示例:**
175+ 
176+```ts
177+import { common } from '@kit.AbilityKit';
178+import { assessment } from '@kit.AutomaticSceneConfigurationKit';
179+import { BusinessError } from '@kit.BasicServicesKit';
180+import { hilog } from '@kit.PerformanceAnalysisKit';
181+ 
182+const DOMAIN: number = 0xFF00;
183+const TAG: string = '[Sample_Assessment]';
184+ 
185+// 评估过程回调,onBegin、onInterrupted、onEnd三个事件统一处理
186+const callback: assessment.IAssessmentCallback = {
187+ onBegin: (error: assessment.AssessmentError): void => {
188+ // AssessmentError.message为可选字段,取值前先做空值兜底
189+ const message: string = error.message ?? '';
190+ if (error.code === assessment.AssessmentErrorCode.OK) {
191+ hilog.info(DOMAIN, TAG, '%{public}s', `onBegin, assessment began successfully, message: ${message}`);
192+ } else {
193+ hilog.error(DOMAIN, TAG, '%{public}s',
194+ `onBegin, assessment begin failed, code: ${error.code}, message: ${message}`);
195+ }
196+ },
197+ onInterrupted: (info: assessment.AssessmentInterruptInfo): void => {
198+ // 评估被中断,业务侧可根据中断原因码做相应处理,如保存答题记录后退出考试页面
199+ hilog.warn(DOMAIN, TAG, '%{public}s', `onInterrupted, code: ${info.code}, message: ${info.message}`);
200+ },
201+ onEnd: (): void => {
202+ hilog.info(DOMAIN, TAG, '%{public}s', 'onEnd, assessment ended');
203+ }
204+};
205+ 
206+@Entry
207+@Component
208+struct Index {
209+ build() {
210+ Button('开始评估')
211+ .onClick(() => {
212+ this.beginAssessment();
213+ })
214+ }
215+ 
216+ private beginAssessment(): void {
217+ // 请在组件内获取context,确保this.getUIContext().getHostContext()返回结果为UIAbilityContext
218+ const host: common.Context | undefined = this.getUIContext().getHostContext();
219+ if (host === undefined) {
220+ hilog.error(DOMAIN, TAG, '%{public}s', 'begin failed, the host context is undefined');
221+ return;
222+ }
223+ const context: common.UIAbilityContext = host as common.UIAbilityContext;
224+ // 评估配置:最大时长1小时(3600000毫秒);
225+ // 评估期间允许运行包名为com.samples.assessment的应用
226+ const config: assessment.AssessmentConfig = {
227+ duration: 3600000,
228+ allowedApps: ['com.samples.assessment']
229+ };
230+ try {
231+ assessment.begin(context, config, callback);
232+ hilog.info(DOMAIN, TAG, '%{public}s',
233+ `begin called, duration: ${config.duration}, allowedApps: ${config.allowedApps.join(',')}`);
234+ } catch (error) {
235+ const err: BusinessError = error as BusinessError;
236+ hilog.error(DOMAIN, TAG, '%{public}s', `begin failed, code: ${err.code}, message: ${err.message}`);
237+ }
238+ }
239+}
240+```
241+ 
242+## assessment.end
243+ 
244+end(context: UIAbilityContext): void
245+ 
246+结束评估,解除评估模式下对系统能力的限制。
247+ 
248+**起始版本:** 26.1.0
249+ 
250+**模型约束**:此接口仅可在Stage模型下使用。
251+ 
252+**需要权限**:ohos.permission.ASSESSMENT_CONFIGURATION
253+ 
254+**系统能力**:SystemCapability.Customization.AssessmentConfiguration
255+ 
256+**参数:**
257+ 
258+| 参数名 | 类型 | 必填 | 说明 |
259+| -------- | -------- | -------- | -------- |
260+| context | [UIAbilityContext](../apis-ability-kit/js-apis-inner-application-uiAbilityContext.md) | 是 | 需要退出评估模式的应用上下文。 |
261+ 
262+**错误码:**
263+ 
264+以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[评估管理错误码](errorcode-assessment.md)。
265+ 
266+| 错误码ID | 错误信息 |
267+| -------- | -------- |
268+| 201 | Permission denied. |
269+| 801 | Capability not supported. |
270+| 36700001 | Assessment internal error. Possible cause: IPC invocation failed internally. |
271+| 36700003 | Assessment configuration service is not active. Possible cause: Not in assessment state. |
272+| 36700004 | Invalid operation. Possible cause: Cannot terminate another active assessment. |
273+ 
274+**示例:**
275+ 
276+```ts
277+import { common } from '@kit.AbilityKit';
278+import { assessment } from '@kit.AutomaticSceneConfigurationKit';
279+import { BusinessError } from '@kit.BasicServicesKit';
280+import { hilog } from '@kit.PerformanceAnalysisKit';
281+ 
282+const DOMAIN: number = 0xFF00;
283+const TAG: string = '[Sample_Assessment]';
284+ 
285+@Entry
286+@Component
287+struct Index {
288+ build() {
289+ Button('交卷')
290+ .onClick(() => {
291+ this.endAssessment();
292+ })
293+ }
294+ 
295+ // 结束由当前应用开启的评估,仅开启评估的应用可以结束该评估
296+ private endAssessment(): void {
297+ // 请在组件内获取context,确保this.getUIContext().getHostContext()返回结果为UIAbilityContext
298+ const host: common.Context | undefined = this.getUIContext().getHostContext();
299+ if (host === undefined) {
300+ hilog.error(DOMAIN, TAG, '%{public}s', 'end failed, the host context is undefined');
301+ return;
302+ }
303+ const context: common.UIAbilityContext = host as common.UIAbilityContext;
304+ try {
305+ assessment.end(context);
306+ hilog.info(DOMAIN, TAG, '%{public}s', 'end called');
307+ } catch (error) {
308+ const err: BusinessError = error as BusinessError;
309+ hilog.error(DOMAIN, TAG, '%{public}s', `end failed, code: ${err.code}, message: ${err.message}`);
310+ }
311+ }
312+}
313+```
314+ 
315+## assessment.isActive
316+ 
317+isActive(): boolean
318+ 
319+查询当前是否处于评估状态。
320+ 
321+**起始版本:** 26.1.0
322+ 
323+**模型约束**:此接口仅可在Stage模型下使用。
324+ 
325+**需要权限**:ohos.permission.ASSESSMENT_CONFIGURATION
326+ 
327+**系统能力**:SystemCapability.Customization.AssessmentConfiguration
328+ 
329+**返回值:**
330+ 
331+| 类型 | 说明 |
332+| -------- | -------- |
333+| boolean | 处于评估状态返回true,否则返回false。 |
334+ 
335+**错误码:**
336+ 
337+以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)。
338+ 
339+| 错误码ID | 错误信息 |
340+| -------- | -------- |
341+| 201 | Permission denied. |
342+| 801 | Capability not supported. |
343+ 
344+**示例:**
345+ 
346+```ts
347+import { assessment } from '@kit.AutomaticSceneConfigurationKit';
348+import { BusinessError } from '@kit.BasicServicesKit';
349+import { hilog } from '@kit.PerformanceAnalysisKit';
350+ 
351+const DOMAIN: number = 0xFF00;
352+const TAG: string = '[Sample_Assessment]';
353+ 
354+// 查询当前是否处于评估状态,处于评估模式返回true
355+function queryActive(): boolean {
356+ try {
357+ const active: boolean = assessment.isActive();
358+ hilog.info(DOMAIN, TAG, '%{public}s', `isActive result: ${active}`);
359+ return active;
360+ } catch (error) {
361+ const err: BusinessError = error as BusinessError;
362+ hilog.error(DOMAIN, TAG, '%{public}s', `isActive failed, code: ${err.code}, message: ${err.message}`);
363+ return false;
364+ }
365+}
366+```
367+ 
368+## assessment.getConfiguration
369+ 
370+getConfiguration(): AssessmentConfig
371+ 
372+获取当前评估配置。
373+ 
374+**起始版本:** 26.1.0
375+ 
376+**模型约束**:此接口仅可在Stage模型下使用。
377+ 
378+**需要权限**:ohos.permission.ASSESSMENT_CONFIGURATION
379+ 
380+**系统能力**:SystemCapability.Customization.AssessmentConfiguration
381+ 
382+**返回值:**
383+ 
384+| 类型 | 说明 |
385+| -------- | -------- |
386+| [AssessmentConfig](#assessmentconfig) | 当前评估配置,包括评估最大时长、评估期间允许运行的应用白名单。 |
387+ 
388+**错误码:**
389+ 
390+以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)。
391+ 
392+| 错误码ID | 错误信息 |
393+| -------- | -------- |
394+| 201 | Permission denied. |
395+| 801 | Capability not supported. |
396+ 
397+**示例:**
398+ 
399+```ts
400+import { assessment } from '@kit.AutomaticSceneConfigurationKit';
401+import { BusinessError } from '@kit.BasicServicesKit';
402+import { hilog } from '@kit.PerformanceAnalysisKit';
403+ 
404+const DOMAIN: number = 0xFF00;
405+const TAG: string = '[Sample_Assessment]';
406+ 
407+// 查询当前评估配置,查询失败时返回undefined
408+function queryConfiguration(): assessment.AssessmentConfig | undefined {
409+ try {
410+ const config: assessment.AssessmentConfig = assessment.getConfiguration();
411+ hilog.info(DOMAIN, TAG, '%{public}s',
412+ `getConfiguration duration: ${config.duration}, allowedApps: ${config.allowedApps.join(',')}`);
413+ return config;
414+ } catch (error) {
415+ const err: BusinessError = error as BusinessError;
416+ hilog.error(DOMAIN, TAG, '%{public}s', `getConfiguration failed, code: ${err.code}, message: ${err.message}`);
417+ return undefined;
418+ }
419+}
420+```
@@ -61,6 +61,7 @@ Standard Libraries<br>
61Kernel Enhance Kit<br>61Kernel Enhance Kit<br>
62Game Controller Kit<br>62Game Controller Kit<br>
63Content Embed Kit<br>63Content Embed Kit<br>
64+Automatic Scene Configuration Kit<br>
64 65 
65## Subsystem66## Subsystem
66Location<br>67Location<br>