-
-
[原创]未成年人模式护航,保障安全健康上网
-
发表于: 2024-11-28 10:37 2048
-
为保护未成年人的上网环境,预防未成年人沉迷网络,帮助未成年人培养积极健康的用网习惯,HarmonyOS SDK 提供未成年人模式功能,在华为设备上加强对面向未成年人的产品和服务的管理。
场景介绍(应用跟随系统未成年人模式状态变化)
1.查询系统状态:建议应用跟随系统未成年人模式状态切换,随系统一同开启或关闭未成年人模式。应用启动时可以查询系统的未成年人模式是否开启。未成年人模式开启时,应用应主动切换为未成年人模式。
2.感知系统状态切换:应用可通过订阅公共事件感知未成年人模式状态变化,应用进程存在时,如果用户切换系统的未成年人模式状态(开启或关闭),应用可主动跟随系统进行切换。
3.验证家长密码:当用户在调整应用内未成年人模式设置(如内容偏好等)时,应用可调用验证未成年人模式密码接口,让用户验证未成年人模式的家长密码,验证成功后可以进行调整。
开发步骤
1.准备:导入minorsProtection模块及相关公共模块。
1 2 3 4 | import { minorsProtection } from '@kit.AccountKit' ; import { hilog } from '@kit.PerformanceAnalysisKit' ; import { BusinessError, commonEventManager } from '@kit.BasicServicesKit' ; / / 以上引入的模块为当前场景的全量模块,请按照具体实现按需引入 |
2.感知系统状态切换:创建订阅者,订阅系统未成年人模式开启/关闭事件。推荐在应用Ability的onCreate生命周期中调用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | / / 订阅者信息。 let subscribeInfo: commonEventManager.CommonEventSubscribeInfo = { events: [commonEventManager.Support.COMMON_EVENT_MINORSMODE_ON,commonEventManager.Support.COMMON_EVENT_MINORSMODE_OFF] }; let subscriber: commonEventManager.CommonEventSubscriber; / / 创建订阅者。 commonEventManager.createSubscriber(subscribeInfo) .then((commonEventSubscriber: commonEventManager.CommonEventSubscriber) = > { subscriber = commonEventSubscriber; / / 订阅公共事件。 commonEventManager.subscribe(subscriber, (error: BusinessError, data: commonEventManager.CommonEventData) = > { if (error) { this.dealCommonEventAllError(error); } else { if (data.event = = = commonEventManager.Support.COMMON_EVENT_MINORSMODE_ON) { / / 订阅到开启事件,可以调用查询年龄段接口 } if (data.event = = = commonEventManager.Support.COMMON_EVENT_MINORSMODE_OFF) { / / 订阅到关闭事件,关闭当前应用的未成年人模式,刷新应用内容展示,取消年龄限制 } } }); }) .catch((error: BusinessError) = > { this.dealCommonEventAllError(error); }); dealCommonEventAllError(error: BusinessError): void { hilog.error( 0x0000 , 'testTag' , `Failed to subscribe. Code: ${error.code}, message: ${error.message}`); } |
3.查询系统状态:开发者可选择以下一种方式获取未成年人模式的开启状态,以及年龄段信息。推荐在自定义组件的aboutToAppear生命周期或者应用Ability的onCreate生命周期中调用。
当应用期望立即获取结果时,推荐使用同步方式;当应用期望使用非阻塞的方式调用接口时,推荐使用Promise异步回调方式。
使用同步方式,调用getMinorsProtectionInfoSync获取未成年人模式的开启状态,以及年龄段信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | if (canIUse( 'SystemCapability.AuthenticationServices.HuaweiID.MinorsProtection' )) { const minorsProtectionInfo: minorsProtection.MinorsProtectionInfo = minorsProtection.getMinorsProtectionInfoSync(); / / 获取未成年人模式开启状态 const minorsProtectionMode: boolean = minorsProtectionInfo.minorsProtectionMode; hilog.info( 0x0000 , 'testTag' , 'Succeeded in getting minorsProtectionMode is: %{public}s' , minorsProtectionMode.valueOf()); / / 未成年人模式已开启,获取年龄段信息 if (minorsProtectionMode) { const ageGroup: minorsProtection.AgeGroup | undefined = minorsProtectionInfo.ageGroup; if (ageGroup) { hilog.info( 0x0000 , 'testTag' , 'Succeeded in getting lowerAge is: %{public}s' , ageGroup.lowerAge.toString()); hilog.info( 0x0000 , 'testTag' , 'Succeeded in getting upperAge is: %{public}s' , ageGroup.upperAge.toString()); } } else { / / 未成年人模式未开启,建议应用跟随系统未成年人模式,展示正常内容 } } else { hilog.info( 0x0000 , 'testTag' , 'The current device does not support the invoking of the getMinorsProtectionInfoSync interface.' ); } |
使用Promise异步回调方式,调用getMinorsProtectionInfo获取未成年人模式的开启状态,以及年龄段信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | if (canIUse( 'SystemCapability.AuthenticationServices.HuaweiID.MinorsProtection' )) { minorsProtection.getMinorsProtectionInfo() .then((minorsProtectionInfo: minorsProtection.MinorsProtectionInfo) = > { / / 获取未成年人模式开启状态 const minorsProtectionMode: boolean = minorsProtectionInfo.minorsProtectionMode; hilog.info( 0x0000 , 'testTag' , 'Succeeded in getting minorsProtectionMode is: %{public}s' , minorsProtectionMode.valueOf()); / / 未成年人模式已开启,获取年龄段信息 if (minorsProtectionMode) { const ageGroup: minorsProtection.AgeGroup | undefined = minorsProtectionInfo.ageGroup; if (ageGroup) { hilog.info( 0x0000 , 'testTag' , 'Succeeded in getting lowerAge is: %{public}s' , ageGroup.lowerAge.toString()); hilog.info( 0x0000 , 'testTag' , 'Succeeded in getting upperAge is: %{public}s' , ageGroup.upperAge.toString()); } } else { / / 未成年人模式未开启,建议应用跟随系统未成年人模式,展示正常内容 } }) .catch((error: BusinessError< object >) = > { this.dealGetMinorsInfoAllError(error); }); } else { hilog.info( 0x0000 , 'testTag' , 'The current device does not support the invoking of the getMinorsProtectionInfo interface.' ); } dealGetMinorsInfoAllError(error: BusinessError< object >): void { hilog.error( 0x0000 , 'testTag' , `Failed to getMinorsProtectionInfo. Code: ${error.code}, message: ${error.message}`); } |
验证家长密码:未成年人模式开启时,如果用户需要调整应用内未成年人模式设置(如内容偏好等),可调用verifyMinorsProtectionCredential方法拉起验证未成年人模式的家长密码页面。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | if (canIUse( 'SystemCapability.AuthenticationServices.HuaweiID.MinorsProtection' )) { minorsProtection.verifyMinorsProtectionCredential(getContext(this)) .then((result: boolean) = > { hilog.info( 0x0000 , 'testTag' , 'Succeeded in getting verify result is: %{public}s' , result.valueOf()); / / 使用结果判断验密是否通过,执行后续流程 }) .catch((error: BusinessError< object >) = > { this.dealVerifyAllError(error); }); } else { hilog.info( 0x0000 , 'testTag' , 'The current device does not support the invoking of the verifyMinorsProtectionCredential interface.' ); } dealVerifyAllError(error: BusinessError< object >): void { hilog.error( 0x0000 , 'testTag' , `Failed to verify. Code: ${error.code}, message: ${error.message}`); } |
了解更多详情>>
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课