Skip to content
Back to skills

Hmos Networkboostkit Scenecallback

ASecurity

订阅网络场景识别信息变化回调,支持监听网络拥塞、弱信号、频繁切换等场景,提供数传策略建议和弱信号预测,适用于视频播放、游戏、直播等实时业务场景

  • 2 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 22, 2026
developmenttypescriptapi

Works with

  • api

Security analysis

A100/100

Pro scans all 4 files and shows the line behind each finding

Scanned September 22, 2026

npx -y skills add IsKenKenYa/skills --skill hmos-networkboostkit-scenecallback --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Hmos Networkboostkit Scenecallback?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Hmos Networkboostkit Scenecallback
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/iskenkenya-hmos-networkboostkit-scenecallback/badge)](https://www.skillsdirectory.com/skills/iskenkenya-hmos-networkboostkit-scenecallback)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: hmos-networkboostkit-scenecallback
description: 订阅网络场景识别信息变化回调,支持监听网络拥塞、弱信号、频繁切换等场景,提供数传策略建议和弱信号预测,适用于视频播放、游戏、直播等实时业务场景
---

# 网络场景识别回调技能

## 功能描述

本技能用于订阅网络场景识别信息变化回调,实时监听网络场景状态(包括正常、拥塞、弱信号、频繁切换),获取数传策略建议(缓存、停止发包、降低/增加发包速率)以及弱信号预测信息(预计进入弱信号区域时间和停留时长)。应用可根据场景信息调整缓存、码率、帧率、分辨率等策略,实现网络自适应优化。

## 使用场景

### 触发词
- "订阅网络场景识别"
- "监听网络场景变化"
- "网络场景回调"
- "网络场景识别"
- "弱信号预测"
- "网络拥塞监听"
- "数传策略建议"

### 能做
- 订阅网络场景识别信息变化,实时获取网络场景状态
- 监听网络拥塞场景,及时调整发包策略
- 监听弱信号场景和弱信号预测信息,提前进行策略调整
- 监听频繁切换场景,优化网络切换时的业务体验
- 获取数传策略建议(缓存、停止/降低/增加/保持发包速率)
- 取消订阅网络场景识别信息

### 绝不做
- 不处理超出网络场景识别范围的请求(如网络质量信息订阅使用 netQosChange)
- 不直接修改网络配置或网络参数
- 不替代应用层的业务策略决策(只提供建议)
- 不处理不涉及 Network Boost Kit 的网络功能

### 补充
- 需要 ohos.permission.GET_NETWORK_INFO 权限
- 仅支持 API version 5.0.0(12) 及以上
- 需要 SystemCapability.Communication.NetworkBoost.Core 系统能力
- 回调信息为 Array<NetworkScene>,包含多条路径的网络场景信息

## 调用规范和规则

### 输入约束
- 无输入参数要求(订阅/取消订阅操作)
- callback 参数必须为有效的回调函数(订阅时必填,取消订阅时可选)
- type 参数固定为 'netSceneChange' 字符串

### 执行约束
- 订阅后系统在网络场景实时信息或预测信息变化后回调给应用
- 回调频率由系统网络场景变化决定,非固定频率
- 取消订阅时若传入 callback,必须与订阅时传入的回调函数是同一个
- 取消订阅时若不传入 callback,则取消所有注册的回调函数

### 内容约束
- 禁止使用固定的回调频率假设
- 禁止在回调函数中执行耗时超过 100ms 的操作(会影响系统回调性能)
- 禁止在回调函数中直接修改网络配置
- 回调函数必须包含异常处理逻辑

### 降级约束
- 权限不足时抛出 201 错误,需要提示用户申请权限
- 参数检查失败时抛出 401 错误,需要校验参数有效性
- 设备不支持该 API 时抛出 801 错误,需要提示用户设备不支持
- 网络场景识别不可用时,使用默认策略或降级为网络质量监听

## 调用流程和步骤

### 步骤1:准备阶段

**前置校验**:
1. 检查设备是否支持 SystemCapability.Communication.NetworkBoost.Core
2. 检查应用是否已申请 ohos.permission.GET_NETWORK_INFO 权限
3. 检查 API version 是否 >= 5.0.0(12)

**参数准备**:
```typescript
// 导入必要模块
import { netQuality } from '@kit.NetworkBoostKit';
import { BusinessError } from '@kit.BasicServicesKit';
```

### 步骤2:订阅网络场景识别信息

**示例代码**:
```typescript
import { netQuality } from '@kit.NetworkBoostKit';
import { BusinessError } from '@kit.BasicServicesKit';

// 定义回调函数处理网络场景信息
function handleNetworkSceneChange(list: Array<netQuality.NetworkScene>): void {
  if (list.length > 0) {
    list.forEach((sceneInfo) => {
      // 处理网络场景信息
      console.info('Network scene changed on path:', sceneInfo.pathType);
      
      // 处理不同场景类型
      switch (sceneInfo.scene) {
        case 'normal':
          console.info('Network is normal');
          // 正常场景处理:恢复默认策略
          break;
        case 'congestion':
          console.info('Network is congested');
          // 拥塞场景处理:降低码率、减少发包
          break;
        case 'frequentHandover':
          console.info('Network is frequent handover');
          // 频繁切换场景处理:缓存数据、暂停关键操作
          break;
        case 'weakSignal':
          console.info('Network is weak signal');
          // 弱信号场景处理:大幅降低码率、增加缓存
          break;
      }
      
      // 处理数传策略建议
      if (sceneInfo.recommendedAction) {
        console.info('Recommended action:', sceneInfo.recommendedAction);
        switch (sceneInfo.recommendedAction) {
          case 'doCaching':
            // 执行缓存动作
            console.info('Execute caching strategy');
            break;
          case 'suspendData':
            // 停止发包
            console.info('Suspend data transmission');
            break;
          case 'decreaseData':
            // 降低发包速率
            console.info('Decrease data rate');
            break;
          case 'increaseData':
            // 增加发包速率
            console.info('Increase data rate');
            break;
          case 'keepData':
            // 保持当前发包速率
            console.info('Keep current data rate');
            break;
        }
      }
      
      // 处理弱信号预测信息
      if (sceneInfo.weakSignalPrediction) {
        const prediction = sceneInfo.weakSignalPrediction;
        if (prediction.isLastPredictionValid) {
          console.info('Weak signal prediction: will enter weak signal in', 
                      prediction.startTime, 'seconds');
          console.info('Will stay in weak signal area for', 
                      prediction.duration, 'seconds');
          // 提前调整策略:增加缓存、降低码率等
        } else {
          console.info('Weak signal prediction is invalid');
        }
      }
    });
  }
}

// 订阅网络场景识别信息
try {
  netQuality.on('netSceneChange', handleNetworkSceneChange);
  console.info('Succeeded in subscribing to netSceneChange');
} catch (err) {
  const error = err as BusinessError;
  console.error('Failed to subscribe to netSceneChange. errCode:', error.code, 
               ', errMessage:', error.message);
}
```

### 步骤3:取消订阅网络场景识别信息

**示例代码**:
```typescript
import { netQuality } from '@kit.NetworkBoostKit';
import { BusinessError } from '@kit.BasicServicesKit';

// 取消订阅所有回调
try {
  netQuality.off('netSceneChange');
  console.info('Succeeded in unsubscribing from netSceneChange');
} catch (err) {
  const error = err as BusinessError;
  console.error('Failed to unsubscribe from netSceneChange. errCode:', error.code, 
               ', errMessage:', error.message);
}

// 取消订阅特定回调
try {
  netQuality.off('netSceneChange', handleNetworkSceneChange);
  console.info('Succeeded in unsubscribing specific callback from netSceneChange');
} catch (err) {
  const error = err as BusinessError;
  console.error('Failed to unsubscribe specific callback. errCode:', error.code, 
               ', errMessage:', error.message);
}
```

### 步骤4:错误处理

```typescript
import { BusinessError } from '@kit.BasicServicesKit';

try {
  netQuality.on('netSceneChange', handleNetworkSceneChange);
} catch (err) {
  const error = err as BusinessError;
  switch (error.code) {
    case 201:
      console.error('Permission denied. Please apply for ohos.permission.GET_NETWORK_INFO');
      // 提示用户申请权限
      break;
    case 401:
      console.error('Parameter check failed. Please verify callback function is valid');
      // 校验参数有效性
      break;
    case 801:
      console.error('Device does not support this API');
      // 提示用户设备不支持,降级处理
      break;
    default:
      console.error('Unknown error:', error.message);
      // 其他错误处理
  }
}
```

### 步骤5:降级处理

```typescript
import { netQuality } from '@kit.NetworkBoostKit';
import { BusinessError } from '@kit.BasicServicesKit';

// 降级方案:网络场景识别不可用时使用默认策略
function useDefaultNetworkStrategy(): void {
  console.warn('Network scene detection unavailable, using default strategy');
  // 使用保守的默认策略
  // 例如:使用较低的码率、较大的缓存
}

// 尝试订阅网络场景识别,失败时降级
try {
  netQuality.on('netSceneChange', handleNetworkSceneChange);
} catch (err) {
  const error = err as BusinessError;
  if (error.code === 801) {
    // 设备不支持网络场景识别,使用默认策略
    useDefaultNetworkStrategy();
  } else if (error.code === 201) {
    // 权限不足,提示用户并使用默认策略
    console.warn('Permission required for network scene detection');
    useDefaultNetworkStrategy();
  } else {
    // 其他错误,抛出异常或使用默认策略
    console.error('Failed to subscribe network scene:', error.message);
    useDefaultNetworkStrategy();
  }
}
```

## 错误码说明

| 错误码 | 说明 | 解决方法 |
|-------|------|---------|
| 201 | 权限校验失败,缺少 ohos.permission.GET_NETWORK_INFO 权限 | 在 module.json5 中申请权限:`"requestPermissions": [{"name": "ohos.permission.GET_NETWORK_INFO"}]` |
| 401 | 参数检查失败,callback 参数无效 | 确保 callback 为有效的回调函数,且符合 `Callback<Array<NetworkScene>>` 类型 |
| 801 | 设备不支持该 API,缺少 SystemCapability.Communication.NetworkBoost.Core | 提示用户设备不支持,使用默认策略或降级为网络质量监听 |

## 编译和修复问题

### 依赖声明

**module.json5 配置**:
```json
{
  "module": {
    "name": "entry",
    "type": "entry",
    "requestPermissions": [
      {
        "name": "ohos.permission.GET_NETWORK_INFO",
        "reason": "$string:permission_reason",
        "usedScene": {
          "abilities": ["EntryAbility"],
          "when": "inuse"
        }
      }
    ]
  }
}
```

**package.json 配置**(如果使用 npm 包管理):
```json
{
  "dependencies": {
    "@kit.NetworkBoostKit": "5.0.0",
    "@kit.BasicServicesKit": "5.0.0"
  }
}
```

### 环境要求
- HarmonyOS API version:>= 5.0.0(12)
- DevEco Studio:>= 5.0.0
- 系统能力:SystemCapability.Communication.NetworkBoost.Core

### 常见编译问题

**问题1:导入模块失败**
```
Error: Cannot find module '@kit.NetworkBoostKit' or its corresponding type declarations.
```
**解决方法**:
- 检查 HarmonyOS SDK 版本是否 >= 5.0.0
- 在 DevEco Studio 中更新 SDK 到最新版本
- 确认 module.json5 中已正确配置

**问题2:权限声明缺失**
```
Error: Permission denied: ohos.permission.GET_NETWORK_INFO
```
**解决方法**:
- 在 module.json5 的 requestPermissions 中添加权限声明
- 确保权限的 reason 和 usedScene 配置正确

**问题3:类型定义错误**
```
Error: Property 'scene' does not exist on type 'NetworkScene'.
```
**解决方法**:
- 检查 NetworkScene 类型定义是否正确导入
- 确认使用的是 `netQuality.NetworkScene` 类型
- 更新 SDK 到最新版本以获取完整的类型定义

## 常见问题与解决方法

### Q1:订阅后没有收到回调信息?
**原因**:
- 网络场景未发生变化(保持正常状态)
- 回调函数未正确定义
- 权限未授予

**解决方法**:
- 检查网络环境是否发生变化(切换网络、进入弱信号区域等)
- 验证回调函数是否正确实现并包含 console.info 等日志输出
- 确认应用已获得 ohos.permission.GET_NETWORK_INFO 权限

### Q2:回调信息中 weakSignalPrediction 为 null?
**原因**:
- 当前网络场景不涉及弱信号预测
- 系统未提供弱信号预测信息
- isLastPredictionValid 为 false

**解决方法**:
- 检查 `sceneInfo.weakSignalPrediction` 是否存在后再处理
- 当 `isLastPredictionValid` 为 false 时忽略预测信息
- 在代码中添加可选链操作符:`sceneInfo.weakSignalPrediction?.isLastPredictionValid`

### Q3:取消订阅后仍收到回调?
**原因**:
- 取消订阅时传入的 callback 与订阅时不一致
- 多次订阅导致多个回调函数注册
- 取消订阅失败

**解决方法**:
- 确保取消订阅时传入的 callback 与订阅时完全相同(同一个函数引用)
- 使用 `netQuality.off('netSceneChange')` 取消所有回调
- 在取消订阅后添加日志验证是否成功

### Q4:如何在业务中应用数传策略建议?
**原因**:应用需要根据 recommendedAction 调整业务策略

**解决方法**:
- `doCaching`:增加视频/音频缓存,预加载更多数据
- `suspendData`:暂停实时数据传输(如直播推流)
- `decreaseData`:降低码率、帧率、分辨率
- `increaseData`:恢复或提高码率、帧率、分辨率
- `keepData`:保持当前策略不变

### Q5:弱信号预测信息如何用于业务优化?
**原因**:应用需要提前调整策略以应对即将到来的弱信号区域

**解决方法**:
- 根据 `startTime` 提前调整策略(提前 startTime 秒)
- 根据 `duration` 确定弱信号持续时间,决定缓存策略
- 在进入弱信号前增加缓存、降低码率
- 在弱信号持续期间保持保守策略
- 在离开弱信号区域后恢复正常策略

## 输出结果报告

执行完成后输出以下信息:

```json
{
  "status": "success",
  "operation": "subscribe/unsubscribe",
  "eventType": "netSceneChange",
  "callbackRegistered": true,
  "apiUsed": [
    "netQuality.on('netSceneChange', callback)",
    "netQuality.off('netSceneChange', callback?)"
  ],
  "networkScenes": [
    {
      "pathType": "CELLULAR_PRIMARY",
      "scene": "normal",
      "recommendedAction": "keepData",
      "weakSignalPrediction": null
    }
  ]
}
```

## 参考文档

- [API开发指南 - 网络场景识别](references/networkboost-scenecallback-guide.md)
- [API参考说明 - netQuality](references/networkboost-netquality-reference.md)

## 完整示例代码

- [ArkTS示例代码](assets/networkboost_scenecallback_example.ets)

## 测试用例

### 正向测试用例
- [订阅网络场景识别成功](tests/test_positive.ets):验证订阅成功并收到回调
- [处理多种网络场景](tests/test_positive.ets):验证处理 normal、congestion、weakSignal 等场景
- [处理弱信号预测信息](tests/test_positive.ets):验证处理有效的弱信号预测
- [取消订阅成功](tests/test_positive.ets):验证取消订阅不再收到回调

### 边界测试用例
- [空回调数组处理](tests/test_boundary.ets):验证回调数组为空时的处理
- [多个路径的场景信息](tests/test_boundary.ets):验证处理多条路径的网络场景
- [取消订阅特定回调](tests/test_boundary.ets):验证取消订阅特定回调函数

### 异常测试用例
- [权限不足场景](tests/test_exception.ets):验证缺少权限时的错误处理
- [参数错误场景](tests/test_exception.ets):验证 callback 参数无效时的错误处理
- [设备不支持场景](tests/test_exception.ets):验证设备不支持 API 时的降级处理
- [网络场景识别不可用](tests/test_exception.ets):验证系统服务不可用时的降级处理

Files in this skill

  • SUB_SKILL.md15.2 KB
  • assets/module.json51.1 KB
  • assets/networkboost_scenecallback_example.ets11.4 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…