# HarmonyOS 未成年人模式:让你的App应用保护青少年(下)
什么是未成年人模式
你有没有注意到,现在很多 App 都有"青少年模式"?比如抖音、快手,开启后会限制使用时间、过滤不适宜内容。这就是未成年人模式。
未成年人模式是 HarmonyOS 提供的一个系统级功能,让家长可以管控孩子使用手机的行为。开发者可以让自己的应用(特别是元服务)支持这个功能,当系统开启未成年人模式时,应用会自动做出相应调整。
简单说,未成年人模式就是一个"家长管控"功能,让你的应用能配合系统保护青少年。
核心功能
未成年人模式提供以下功能:
- 订阅公共事件:监听系统未成年人模式的开启/关闭。当家长在系统设置里开启或关闭未成年人模式时,系统会发出公共事件。你的元服务订阅了这个事件后,就能第一时间知道状态变化,做出相应调整
- 查询开启状态:获取当前未成年人模式是否开启。除了被动等通知,你也可以主动查询。比如元服务启动时,先查一下当前是不是未成年人模式,如果是的话就直接进入青少年模式
- 开启系统未成年人模式:引导用户开启系统的未成年人模式。如果你的元服务发现当前没有开启未成年人模式,可以调用这个接口拉起系统的设置页面,引导家长去开启
- 关闭元服务未成年人模式:单独关闭某个元服务的未成年人模式。有时候家长只想关闭某个特定元服务的限制,不影响其他应用。这个功能需要验证密码,确保只有家长能操作
环境搭建
硬件要求
- 设备类型:phone、tablet
- HarmonyOS 系统:HarmonyOS 6.0.0 Release 及以上
软件要求
- DevEco Studio 版本:DevEco Studio 6.0.0 Release 及以上
- HarmonyOS SDK 版本:HarmonyOS 6.0.0 Release SDK 及以上
搭建步骤
- 安装 DevEco Studio:去华为开发者官网下载安装
- 配置开发环境:确保网络环境正常
- 设备调试:使用真机进行调试
项目结构
├── entry/src/main/ets
│ ├── common
│ │ └── CommonEventUtil.ets // 公共事件工具类
│ ├── entryability
│ │ └── EntryAbility.ets // 程序入口类
│ └── pages
│ └── Index.ets // 主页面
项目结构很简单,核心逻辑在 CommonEventUtil.ets 和 Index.ets 里。
未成年人模式订阅流程
下面是元服务接入未成年人模式的流程:
未成年人模式状态管理
下面是未成年人模式的状态管理流程:
第一步:导入模块
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError, commonEventManager } from '@kit.BasicServicesKit';
import { minorsProtection } from '@kit.AccountKit';
导入三个模块:
commonEventManager:公共事件管理,用来订阅未成年人模式事件minorsProtection:未成年人模式保护接口BusinessError:错误处理
第二步:订阅未成年人模式公共事件
在元服务启动时,订阅未成年人模式的公共事件。
const subscribeInfo: commonEventManager.CommonEventSubscribeInfo = {
events: [
commonEventManager.Support.COMMON_EVENT_MINORSMODE_ON,
commonEventManager.Support.COMMON_EVENT_MINORSMODE_OFF
]
};
定义要订阅的事件:
COMMON_EVENT_MINORSMODE_ON:未成年人模式开启COMMON_EVENT_MINORSMODE_OFF:未成年人模式关闭
static subscriber: commonEventManager.CommonEventSubscriber;
static subscriberCommonEvent() {
// 创建订阅者
commonEventManager.createSubscriber(subscribeInfo)
.then((commonEventSubscriber: commonEventManager.CommonEventSubscriber) => {
CommonEventUtil.subscriber = commonEventSubscriber;
// 订阅公共事件
try {
commonEventManager.subscribe(CommonEventUtil.subscriber, CommonEventUtil.subscribeCallback);
} catch (error) {
const err: BusinessError = error as BusinessError;
console.error(`Failed to subscribe. errCode: ${err.code}, message: ${err.message}`);
}
})
.catch((err: BusinessError) => {
console.error(`Failed to createSubscriber. errCode: ${err.code}, message: ${err.message}.`);
});
}
创建订阅者,然后订阅公共事件。当系统未成年人模式状态发生变化时,会调用回调函数。
第三步:处理公共事件回调
当收到公共事件时,需要做出相应处理。
private static subscribeCallback(err: BusinessError, data: commonEventManager.CommonEventData) {
if (err) {
console.error(`Failed to subscribe. errCode: ${err.code}, message: ${err.message}`);
return;
}
// 收到开启未成年人模式事件
if (data.event === commonEventManager.Support.COMMON_EVENT_MINORSMODE_ON) {
AppStorage.setOrCreate("minorsProtectionMode", true);
const userTurnOffFlag: boolean | undefined = AppStorage.get<boolean>('userTurnOffFlag');
// 如果用户单独关闭过元服务的未成年人模式,就不开启
if (userTurnOffFlag) {
return;
}
// 获取年龄组信息
if (canIUse('SystemCapability.AuthenticationServices.HuaweiID.MinorsProtection')) {
try {
const minorsProtectionInfo: minorsProtection.MinorsProtectionInfo =
minorsProtection.getMinorsProtectionInfoSync();
const ageGroup: minorsProtection.AgeGroup | undefined = minorsProtectionInfo.ageGroup;
if (ageGroup) {
AppStorage.setOrCreate('lowerAge', ageGroup.lowerAge);
AppStorage.setOrCreate('upperAge', ageGroup.upperAge);
}
} catch (error) {
console.error(`Failed to invoke getMinorsProtectionInfoSync. errCode: ${error.code}, message: ${error.message}`);
}
}
return;
}
// 收到关闭未成年人模式事件
if (data.event === commonEventManager.Support.COMMON_EVENT_MINORSMODE_OFF) {
AppStorage.setOrCreate("minorsProtectionMode", false);
AppStorage.setOrCreate("userTurnOffFlag", false);
}
}
处理逻辑:
- 收到开启事件:设置未成年人模式为开启,获取年龄组信息
- 收到关闭事件:设置未成年人模式为关闭
第四步:查询未成年人模式状态
元服务可以主动查询当前未成年人模式的状态。
private getMinorsProtectionInfoSync() {
if (canIUse('SystemCapability.AuthenticationServices.HuaweiID.MinorsProtection')) {
try {
// 检查设备是否支持未成年人模式
if (!minorsProtection.supportMinorsMode()) {
console.info('The current device does not support the youth mode.');
return;
}
// 查询未成年人模式状态
const minorsProtectionInfo: minorsProtection.MinorsProtectionInfo =
minorsProtection.getMinorsProtectionInfoSync();
const minorsProtectionMode: boolean = minorsProtectionInfo.minorsProtectionMode;
this.minorsProtectionMode = minorsProtectionInfo.minorsProtectionMode;
// 如果开启了,获取年龄组信息
if (minorsProtectionMode) {
const ageGroup: minorsProtection.AgeGroup | undefined = minorsProtectionInfo.ageGroup;
if (ageGroup) {
this.lowerAge = ageGroup.lowerAge;
this.upperAge = ageGroup.upperAge;
}
} else {
// 未开启,重置单独关闭标记
this.userTurnOffFlag = false;
}
} catch (error) {
console.error(`Failed to invoke getMinorsProtectionInfoSync. errCode: ${error.code}, message: ${error.message}`);
}
}
}
调用 minorsProtection.getMinorsProtectionInfoSync() 查询未成年人模式状态。返回的信息包括:
minorsProtectionMode:是否开启ageGroup:年龄组信息(如果开启了)
第五步:开启系统未成年人模式
如果系统未成年人模式未开启,可以引导用户开启。
private async turnOnMinorsMode() {
if (canIUse('SystemCapability.AuthenticationServices.HuaweiID.MinorsProtection')) {
try {
// 检查设备是否支持
if (!minorsProtection.supportMinorsMode()) {
console.info('The current device does not support the youth mode.');
return;
}
} catch (error) {
console.error(`Failed to invoke supportMinorsMode. errCode: ${error.code}, message: ${error.message}`);
return;
}
// 调用开启未成年人模式接口
minorsProtection.leadToTurnOnMinorsMode(this.getUIContext().getHostContext())
.catch((error: BusinessError<Object>) => {
console.error(`Failed to turnOnMinorsMode. errCode: ${error.code}, message: ${error.message}`);
try {
this.promptAction.showToast({ message: `${error.code}:${error.message}` });
} catch (error) {
console.error(`Failed to showToast. errCode: ${error?.code}, message: ${error?.message}`);
}
});
}
}
调用 minorsProtection.leadToTurnOnMinorsMode 会拉起系统的未成年人模式开启页面,引导用户完成设置。
第六步:关闭元服务未成年人模式
用户可以单独关闭某个元服务的未成年人模式。
private async verifyMinorsProtectionCredential(): Promise<boolean> {
try {
if (canIUse('SystemCapability.AuthenticationServices.HuaweiID.MinorsProtection')) {
try {
// 检查设备是否支持
if (!minorsProtection.supportMinorsMode()) {
return false;
}
// 验证未成年人模式密码
const result = await minorsProtection.verifyMinorsProtectionCredential(
this.getUIContext().getHostContext()
);
return result;
} catch (error) {
this.promptAction.showToast({ message: error.message });
return false;
}
}
return false;
} catch (error) {
console.error(`Failed to invoke verifyMinorsProtectionCredential. errCode: ${error?.code}, errMessage: ${error?.message}`);
return false;
}
}
调用 minorsProtection.verifyMinorsProtectionCredential 验证密码。验证通过后,才允许关闭元服务的未成年人模式。
实际应用场景
未成年人模式在实际开发中有很多用途:
视频应用
// 根据未成年人模式调整内容
if (minorsProtectionMode) {
// 过滤不适宜内容
filterContent(ageGroup);
// 限制使用时间
limitUsageTime();
}
游戏应用
// 未成年人模式下限制游戏时间
if (minorsProtectionMode) {
if (ageGroup.lowerAge < 12) {
// 12岁以下,每天只能玩1小时
limitPlayTime(60);
} else {
// 12-18岁,每天只能玩2小时
limitPlayTime(120);
}
}
社交应用
// 未成年人模式下限制社交功能
if (minorsProtectionMode) {
// 禁止陌生人私信
disableStrangerMessage();
// 过滤敏感内容
filterSensitiveContent();
}
适用场景
未成年人模式适合以下场景:
- 视频应用:过滤不适宜内容、限制使用时间
- 游戏应用:限制游戏时间、限制充值
- 社交应用:限制社交功能、过滤敏感内容
- 教育应用:适龄内容推荐
- 元服务:配合系统未成年人模式
注意事项
- 设备支持:需要设备支持未成年人模式
- 密码验证:关闭未成年人模式需要验证密码
- 年龄组:要根据年龄组做不同处理
- 单独关闭:用户可以单独关闭某个元服务的未成年人模式
- 隐私合规:使用未成年人模式要遵守相关法规
总结
未成年人模式让你的元服务保护青少年,核心流程:
- 订阅未成年人模式公共事件
- 查询未成年人模式状态
- 开启系统未成年人模式
- 关闭元服务未成年人模式
掌握了这些,你就能让你的应用支持未成年人模式,保护青少年健康成长。
更多推荐


所有评论(0)