鸿蒙专家 发表于 2026-6-15 16:00:00

HarmonyOS 6.1.1 Media Kit实战:AVScreenCapture隐私保护监听与多屏联合录制

HarmonyOS 6.1.1(API 24)对 Media Kit 的 AVScreenCapture C API 进行了底层重构,新增隐私保护回调机制与多屏幕联合录制能力,为解决敏感内容防截屏录屏与多端协作场景下的安全与交互矛盾提供了原生方案。

一、痛点分析
传统防录屏方案常采用全局窗口置黑,导致正常操作也受干扰。HarmonyOS 6.1.1 通过精细化的回调监听,让应用在 Native 层实时响应隐私区域变动,并支持多显示器场景下联合录制的能力评估与选择结果解包。

二、核心 API 说明
1. 隐私保护回调 OH_AVScreenCapture_SetPrivacyProtectCallback
在开始捕获前绑定回调函数,当系统检测到敏感隐私页面(如密码输入、金融账户显示)时,触发 AV_SCREEN_CAPTURE_PRIVACY_ON 或 OFF 状态,应用可据此替换渲染画布或打水印。

2. 多屏幕录制能力评估 OH_AVScreenCapture_GetMultiDisplayCaptureCapability
调用时传入选中的 DisplayID 数组和数量,返回 OH_MultiDisplayCapability 结构体,包含 isSupported(是否支持联合录制)、maxDisplayCount(最大并发屏数)等字段,用于提前判断硬编带宽是否充足。

3. 选择结果解包 OH_AVScreenCapture_GetMultiDisplayIdsSelected
在系统 Picker 回调中,通过该 API 解析出用户勾选的 DisplayID 数组。注意:返回值所指向的内存由 UserSelectionInfo 托管,严禁手动 free,否则会导致堆内存重复释放崩溃。

三、实战实现步骤
在 Native C++ 层创建桥接文件(screencapture_bridge_napi.cpp),导出 NAPI 接口供 ArkTS 调用。

1. 注册隐私保护回调

static void NativeOnPrivacyProtect(struct OH_AVScreenCapture *capture, OH_AVScreenCapture_PrivacyProtectState state, void *userData) {
    OH_LOG_INFO(LOG_APP, "🚨 NativeOnPrivacyProtect 触发,状态: %{public}d", state);
    // 可在此通过 tsfn 推送状态到 JS 线程
}

static napi_value SetPrivacyProtectCallback(napi_env env, napi_callback_info info) {
    // 创建 OH_AVScreenCapture 实例(若未创建)
    if (g_screenCaptureInstance == nullptr) {
      g_screenCaptureInstance = OH_AVScreenCapture_Create();
    }
    OH_AVSCREEN_CAPTURE_ErrCode result = OH_AVScreenCapture_SetPrivacyProtectCallback(
      g_screenCaptureInstance,
      NativeOnPrivacyProtect,
      nullptr
    );
    // 返回结果码
    napi_value retVal;
    napi_create_int32(env, result, &retVal);
    return retVal;
}


2. 模拟多屏选择解包与能力校验

static napi_value CheckMultiDisplayIdsSelected(napi_env env, napi_callback_info info) {
    // 模拟 UserSelectionInfo 数据
    uint64_t* displayIds = nullptr;
    size_t count = 0;
    // 在真实场景中,UserSelectionInfo 由回调提供,此处模拟解包
    count = 2;
    displayIds = new uint64_t{0, 1};

    OH_MultiDisplayCapability capability;
    // 调用能力评估 API
    OH_AVSCREEN_CAPTURE_ErrCode capResult = OH_AVScreenCapture_GetMultiDisplayCaptureCapability(
      g_screenCaptureInstance,
      displayIds,
      count,
      &capability
    );
    // 组装返回值
    napi_value resultObj;
    napi_create_object(env, &resultObj);
    napi_value isSupportedVal;
    napi_create_boolean(env, capability.isSupported, &isSupportedVal);
    napi_set_named_property(env, resultObj, "isSupported", isSupportedVal);
    // ...
    delete[] displayIds; // 仿真内存需手动释放,真实 selection 解包时禁止
    return resultObj;
}


在 ArkTS 层(MediaKitScreenCaptureDetail.ets)中,通过 import native lib 调用上述接口,实现多屏勾选、隐私状态切换和实时日志输出。

四、关键注意事项
- 隐私回调必须在开始录制前注册,且回调函数内不能执行耗时操作,应使用线程安全函数回传 UI。
- 多屏选择结果解包时,必须严格遵循内存生命周期,不可对托管指针执行 free。
- 联合录制能力评估应在用户选择屏幕后立即执行,若返回 NOT_PERMIT 则提示降级或限制屏数。

五、实践效果
通过 Demo 中的“多端录屏与隐私防护舱”,可模拟进入金融页面后触发隐私保护占位图替换,以及三屏全选时触发带宽警告。这些能力确保了敏感内容在录屏时被安全屏蔽,同时不影响正常区域显示,大幅提升用户体验与合规性。

以上实现均基于 HarmonyOS 6.1.1 Media Kit C API,建议开发者在真机或模拟器上验证多屏和隐私场景的逻辑正确性。

热心网友6 发表于 2026-6-15 16:05:00

Re: HarmonyOS 6.1.1 Media Kit实战:AVScreenCapture隐私保护监听与多屏联合录制

感谢楼主分享这么详细的实战解析!HarmonyOS 6.1.1 在隐私保护与多屏协作上的底层重构确实解决了传统方案“一刀切”的痛点,特别是隐私回调机制与能力评估接口的配合,让开发者在原生层就能精确控制录制行为。想请教一下,在多屏联合录制场景下,如果某个屏幕不支持硬编或带宽不足,是否有推荐的降级策略(比如自动裁剪分辨率还是提示用户手动选择)?另外,隐私回调中通过 tsfn 回传状态到 JS 线程时,能否给个简单的 ArkTS 侧监听示例?再次感谢!

热心网友7 发表于 2026-6-16 17:25:00

Re: HarmonyOS 6.1.1 Media Kit实战:AVScreenCapture隐私保护监听与多屏联合录制

非常实用的分享!API 24 对 AVScreenCapture 的隐私保护和多屏联合录制能力确实解决了过去很多痛点,尤其是隐私回调不再依赖全局窗口置黑,而是通过 Native 层回调动态替换画布,这个思路避免了对正常操作的干扰。想请教一下:您在实战中处理 PrivacyProtect 回调时,通过 tsfn 回传 JS 线程具体是怎么做的?因为回调内不能耗时操作,但 ArkTS 主线程更新 UI 又需要上下文,能否简要贴一下 tsfn 的绑定和调用示例?另外,多屏选择的 DisplayID 数组内存托管问题确实容易踩坑,文档里强调不能手动 free,但示例里又用了 new 和 delete 来模拟数据,实际上真实场景中从 UserSelectionInfo 取出的指针应该完全交给系统管理对吧?期待后续能继续分享端侧联合录制的性能调优经验。

热心网友5 发表于 2026-6-16 20:00:00

Re: HarmonyOS 6.1.1 Media Kit实战:AVScreenCapture隐私保护监听与多屏联合录制

非常详尽的实战分享!HarmonyOS 6.1.1 这套隐私保护回调 + 多屏联合录制确实很实用,尤其是替代传统的全局置黑方案,对用户体验提升明显。请教一下,隐私回调里用 tsfn 回传 JS 线程时,一般会怎么处理频繁的状态切换?另外模拟解包时手动 delete[] 的那个注释提醒很关键,真实场景下确实容易踩内存重复释放的坑。感谢分享!
页: [1]
查看完整版本: HarmonyOS 6.1.1 Media Kit实战:AVScreenCapture隐私保护监听与多屏联合录制