HarmonyOS鸿蒙Next中OH_VideoCaptureInfo的missionIDs怎么设置?

HarmonyOS鸿蒙Next中OH_VideoCaptureInfo的missionIDs怎么设置?

录制指定窗口时,missionID如何获取和设置?


更多关于HarmonyOS鸿蒙Next中OH_VideoCaptureInfo的missionIDs怎么设置?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

10 回复

【背景知识】

HarmonyOS的窗口模块将窗口界面分为系统窗口、应用窗口两种基本类型。

  • 系统窗口:系统窗口指完成系统特定功能的窗口。如音量条、壁纸、通知栏、状态栏、导航栏等。

  • 应用窗口:应用窗口区别于系统窗口,指与应用显示相关的窗口。根据显示内容的不同,应用窗口又分为应用主窗口、应用子窗口两种类型。应用窗口开发可以参考管理应用窗口(Stage模型)

    • 应用主窗口:应用主窗口用于显示应用界面,会在"任务管理界面"显示。设置方式参考设置应用主窗口
    • 应用子窗口:应用子窗口用于显示应用的弹窗、悬浮窗等辅助窗口,不会在"任务管理界面"显示。应用子窗口的生命周期跟随应用主窗口。设置方式参考设置应用子窗口

【解决方案】

  • 由于在native侧无法直接获取window实例,需要在ArkTS侧Ability的onWindowStageCreate生命周期中获取。
onWindowStageCreate(windowStage: window.WindowStage): void {
  // Main window is created, set main page for this ability
  hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');
  // 1.获取应用主窗口。
  let windowClass: window.Window | null = null;
  windowStage.getMainWindow((err: BusinessError, data) => {
    let errCode: number = err.code;
    if (errCode) {
      console.error(`Failed to obtain the main window. CCode:${err.code}, message:${err.message}`);
      return;
    }
    windowClass = data;
    // 通过windowClass的getWindowProperties方法获取id信息
    this.windowID = windowClass.getWindowProperties().id;
    console.info(`Succeeded in obtaining the main window. Result:${data}`);

  })
  windowStage.loadContent('pages/Index', (err) => {
    if (err.code) {
      hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
      return;
    }
    hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.');
  });
}
  • 获取到windowID后,调用native方法将windowID传入native侧。
import native from 'libentry.so'
// ...
native.setWindowID(this.windowID)
  • 在native侧接收到windowID后,将windowID进行固化用于后续使用。
int32_t g_WindowID;
static napi_value SetWindowID(napi_env env, napi_callback_info info) {
    size_t argc = 1;
    napi_value args[1] = {nullptr};
    napi_typedarray_type type_napi;

    napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);

    napi_get_value_int32(env, args[0], &g_WindowID);

    OH_LOG_ERROR(LOG_APP, "get windowID %{public}d", g_WindowID);
    return nullptr;
}

【常见FAQ】

Q:Native侧有办法对窗口进行管理和控制么? A:可以通过WindowManager模块的C API对窗口进行控制,由于其接口均需要windowID作为入参,需要在调用前获取到windowID。

Q:如何传入多个windowID? A:如果需要传入多个windowID可以通过构建Int32Array进行填充,在native侧创建数组接收。

更多关于HarmonyOS鸿蒙Next中OH_VideoCaptureInfo的missionIDs怎么设置?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


获取和和设置missionID可通过distributedMissionManager接口查询当前设备运行的任务列表,从返回的MissionInfo对象中提取missionId字段如:

import distributedMissionManager from '@kit.DistributedScheduleManagerKit';

distributedMissionManager.getMissionInfos('', (error, data) => {
    if (error) return;
    const missionIds = data.map(info => info.missionId);
});

通过window模块的on('windowStatusChange')事件监听窗口状态变更,从回调参数中获取当前窗口的missionId

WindowManager里面没有mission id,只有windowID,但windowID怎么获取呢?

"用系统提供的窗口管理接口(比如 WindowManager)找到你想录的窗口,拿到它的 mission ID" 能具体点么?

  1. 怎么设置 missionIDs

    1. 先获取窗口的 mission ID:用系统提供的窗口管理接口(比如 WindowManager)找到你想录的窗口,拿到它的 mission ID(类似窗口的 “身份证号”)。
    2. 填到结构体里:创建一个数组,把这个 mission ID 放进去,再把数组地址和长度(比如 1)分别赋值给 OH_VideoCaptureInfomissionIDsmissionIDsLen 字段。
  2. 代码示例(超简化):

    // 假设 targetMissionID 是你通过系统接口查到的窗口 ID
    int32_t targetMissionID = 123;  // 实际要动态获取
    int32_t *missionIDs = malloc(sizeof(int32_t));
    missionIDs[0] = targetMissionID;
    
    captureInfo.missionIDs = missionIDs;  // 结构体字段赋值
    captureInfo.missionIDsLen = 1;        // 就一个 ID
    
  3. 注意事项:

    1. 权限:可能要申请 “录制屏幕” 或 “窗口管理” 权限。
    2. 内存:用完 missionIDs 后记得 free(),避免内存泄漏。
    3. 版本差异:不同系统版本的接口可能不同,按实际 SDK 文档调整。

关键:先找到窗口的 mission ID,再塞进数组传给结构体,没那么难!

用系统提供的窗口管理接口(比如 WindowManager)找到你想录的窗口,拿到它的 mission ID。

有要学HarmonyOS AI的同学吗,联系我:https://www.itying.com/goods-1206.html

WindowManager里面没有mission id,只有windowID,但windowID怎么获取呢?

在HarmonyOS Next中,OH_VideoCaptureInfo的missionIDs是用于标识视频捕获任务的数组。设置时需要先创建OH_VideoCaptureInfo结构体实例,然后为missionIDs数组分配内存并赋值。示例代码:

let videoCaptureInfo: OH_VideoCaptureInfo = {
  missionIDs: new Uint32Array([1, 2, 3]), // 设置任务ID数组
  // 其他字段...
};

注意:missionIDs数组元素应为无符号32位整数,每个ID代表一个独立的视频捕获任务。数组长度由实际需求决定。

在HarmonyOS Next中,OH_VideoCaptureInfo结构体的missionIDs用于指定要录制的窗口任务ID。获取和设置方法如下:

  1. 获取missionID:
  • 通过WindowManager.getTopWindow()获取顶层窗口的missionID
  • 使用WindowManager.getAllWindows()遍历窗口列表获取特定窗口的missionID
  • 通过AbilityContext获取当前Ability的missionID
  1. 设置missionIDs: 直接将获取到的missionID赋值给OH_VideoCaptureInfo结构体的missionIDs成员即可。例如:
OH_VideoCaptureInfo info;
info.missionIDs = your_mission_id;  // 设置要录制的窗口ID

注意:

  1. 需要确保应用具有屏幕录制权限
  2. 只能录制当前应用或授权应用的窗口
  3. 多个窗口录制可以传入数组形式的missionIDs

获取missionID的具体代码实现会根据您使用的开发语言(ArkTS/C/C++)有所不同。

回到顶部