什么是未成年人模式

你有没有注意到,现在很多 App 都有"青少年模式"?比如抖音、快手,开启后会限制使用时间、过滤不适宜内容。这就是未成年人模式。

未成年人模式是 HarmonyOS 提供的一个系统级功能,让家长可以管控孩子使用手机的行为。开发者可以让自己的应用(特别是元服务)支持这个功能,当系统开启未成年人模式时,应用会自动做出相应调整。

简单说,未成年人模式就是一个"家长管控"功能,让你的应用能配合系统保护青少年。

核心功能

未成年人模式提供以下功能:

  1. 订阅公共事件:监听系统未成年人模式的开启/关闭。当家长在系统设置里开启或关闭未成年人模式时,系统会发出公共事件。你的元服务订阅了这个事件后,就能第一时间知道状态变化,做出相应调整
  2. 查询开启状态:获取当前未成年人模式是否开启。除了被动等通知,你也可以主动查询。比如元服务启动时,先查一下当前是不是未成年人模式,如果是的话就直接进入青少年模式
  3. 开启系统未成年人模式:引导用户开启系统的未成年人模式。如果你的元服务发现当前没有开启未成年人模式,可以调用这个接口拉起系统的设置页面,引导家长去开启
  4. 关闭元服务未成年人模式:单独关闭某个元服务的未成年人模式。有时候家长只想关闭某个特定元服务的限制,不影响其他应用。这个功能需要验证密码,确保只有家长能操作

环境搭建

硬件要求

  • 设备类型:phone、tablet
  • HarmonyOS 系统:HarmonyOS 6.0.0 Release 及以上

软件要求

  • DevEco Studio 版本:DevEco Studio 6.0.0 Release 及以上
  • HarmonyOS SDK 版本:HarmonyOS 6.0.0 Release SDK 及以上

搭建步骤

  1. 安装 DevEco Studio:去华为开发者官网下载安装
  2. 配置开发环境:确保网络环境正常
  3. 设备调试:使用真机进行调试

项目结构

├── entry/src/main/ets
│  ├── common
│  │  └── CommonEventUtil.ets    // 公共事件工具类
│  ├── entryability
│  │  └── EntryAbility.ets       // 程序入口类
│  └── pages
│     └── Index.ets              // 主页面

项目结构很简单,核心逻辑在 CommonEventUtil.etsIndex.ets 里。

未成年人模式订阅流程

下面是元服务接入未成年人模式的流程:

MINORSMODE_ON

MINORSMODE_OFF

导入公共事件模块

定义订阅事件

创建订阅者

订阅公共事件

收到事件类型

设置未成年人模式为开启

设置未成年人模式为关闭

获取年龄组信息

根据年龄调整应用行为

恢复正常模式

未成年人模式状态管理

下面是未成年人模式的状态管理流程:

低龄

高龄

应用启动

查询未成年人模式状态

是否已开启?

获取年龄组信息

进入正常模式

年龄判断

严格限制模式

适度限制模式

过滤内容/限制功能

正常使用

需要关闭?

验证密码

关闭未成年人模式

继续限制

第一步:导入模块

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);
  }
}

处理逻辑:

  1. 收到开启事件:设置未成年人模式为开启,获取年龄组信息
  2. 收到关闭事件:设置未成年人模式为关闭

第四步:查询未成年人模式状态

元服务可以主动查询当前未成年人模式的状态。

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();
}

适用场景

未成年人模式适合以下场景:

  • 视频应用:过滤不适宜内容、限制使用时间
  • 游戏应用:限制游戏时间、限制充值
  • 社交应用:限制社交功能、过滤敏感内容
  • 教育应用:适龄内容推荐
  • 元服务:配合系统未成年人模式

注意事项

  1. 设备支持:需要设备支持未成年人模式
  2. 密码验证:关闭未成年人模式需要验证密码
  3. 年龄组:要根据年龄组做不同处理
  4. 单独关闭:用户可以单独关闭某个元服务的未成年人模式
  5. 隐私合规:使用未成年人模式要遵守相关法规

总结

未成年人模式让你的元服务保护青少年,核心流程:

  1. 订阅未成年人模式公共事件
  2. 查询未成年人模式状态
  3. 开启系统未成年人模式
  4. 关闭元服务未成年人模式

掌握了这些,你就能让你的应用支持未成年人模式,保护青少年健康成长。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐