未成年人模式護航,保障安全健康上網

HarmonyOS_SDK發表於2024-11-28

為保護未成年人的上網環境,預防未成年人沉迷網路,幫助未成年人培養積極健康的用網習慣,HarmonyOS SDK 提供未成年人模式功能,在華為裝置上加強對面向未成年人的產品和服務的管理。

場景介紹(應用跟隨系統未成年人模式狀態變化)

1.查詢系統狀態:建議應用跟隨系統未成年人模式狀態切換,隨系統一同開啟或關閉未成年人模式。應用啟動時可以查詢系統的未成年人模式是否開啟。未成年人模式開啟時,應用應主動切換為未成年人模式。

2.感知系統狀態切換:應用可透過訂閱公共事件感知未成年人模式狀態變化,應用程序存在時,如果使用者切換系統的未成年人模式狀態(開啟或關閉),應用可主動跟隨系統進行切換。

3.驗證家長密碼:當使用者在調整應用內未成年人模式設定(如內容偏好等)時,應用可呼叫驗證未成年人模式密碼介面,讓使用者驗證未成年人模式的家長密碼,驗證成功後可以進行調整。

開發步驟

1.準備:匯入minorsProtection模組及相關公共模組。

import { minorsProtection } from '@kit.AccountKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError, commonEventManager } from '@kit.BasicServicesKit';
// 以上引入的模組為當前場景的全量模組,請按照具體實現按需引入

2.感知系統狀態切換:建立訂閱者,訂閱系統未成年人模式開啟/關閉事件。推薦在應用Ability的onCreate生命週期中呼叫。

//訂閱者資訊。
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獲取未成年人模式的開啟狀態,以及年齡段資訊。

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獲取未成年人模式的開啟狀態,以及年齡段資訊。

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>) =&gt; {
      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方法拉起驗證未成年人模式的家長密碼頁面。

if (canIUse('SystemCapability.AuthenticationServices.HuaweiID.MinorsProtection')) {
  minorsProtection.verifyMinorsProtectionCredential(getContext(this))
    .then((result: boolean) =&gt; {
      hilog.info(0x0000, 'testTag', 'Succeeded in getting verify result is: %{public}s', result.valueOf());
      // 使用結果判斷驗密是否透過,執行後續流程
    })
    .catch((error: BusinessError<object>) =&gt; {
      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}`);
}

瞭解更多詳情>>

獲取未成年人模式服務開發指導文件

相關文章