查看: 121|回复: 1

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

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
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. 注册隐私保护回调
  1. static void NativeOnPrivacyProtect(struct OH_AVScreenCapture *capture, OH_AVScreenCapture_PrivacyProtectState state, void *userData) {
  2.     OH_LOG_INFO(LOG_APP, "🚨 [C API 回调] NativeOnPrivacyProtect 触发,状态: %{public}d", state);
  3.     // 可在此通过 tsfn 推送状态到 JS 线程
  4. }
  5. static napi_value SetPrivacyProtectCallback(napi_env env, napi_callback_info info) {
  6.     // 创建 OH_AVScreenCapture 实例(若未创建)
  7.     if (g_screenCaptureInstance == nullptr) {
  8.         g_screenCaptureInstance = OH_AVScreenCapture_Create();
  9.     }
  10.     OH_AVSCREEN_CAPTURE_ErrCode result = OH_AVScreenCapture_SetPrivacyProtectCallback(
  11.         g_screenCaptureInstance,
  12.         NativeOnPrivacyProtect,
  13.         nullptr
  14.     );
  15.     // 返回结果码
  16.     napi_value retVal;
  17.     napi_create_int32(env, result, &retVal);
  18.     return retVal;
  19. }
复制代码

2. 模拟多屏选择解包与能力校验
  1. static napi_value CheckMultiDisplayIdsSelected(napi_env env, napi_callback_info info) {
  2.     // 模拟 UserSelectionInfo 数据
  3.     uint64_t* displayIds = nullptr;
  4.     size_t count = 0;
  5.     // 在真实场景中,UserSelectionInfo 由回调提供,此处模拟解包
  6.     count = 2;
  7.     displayIds = new uint64_t[2]{0, 1};
  8.     OH_MultiDisplayCapability capability;
  9.     // 调用能力评估 API
  10.     OH_AVSCREEN_CAPTURE_ErrCode capResult = OH_AVScreenCapture_GetMultiDisplayCaptureCapability(
  11.         g_screenCaptureInstance,
  12.         displayIds,
  13.         count,
  14.         &capability
  15.     );
  16.     // 组装返回值
  17.     napi_value resultObj;
  18.     napi_create_object(env, &resultObj);
  19.     napi_value isSupportedVal;
  20.     napi_create_boolean(env, capability.isSupported, &isSupportedVal);
  21.     napi_set_named_property(env, resultObj, "isSupported", isSupportedVal);
  22.     // ...
  23.     delete[] displayIds; // 仿真内存需手动释放,真实 selection 解包时禁止
  24.     return resultObj;
  25. }
复制代码

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

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

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

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

使用道具 举报

发表于 2 小时前 | 显示全部楼层

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

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

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-15 18:06 , Processed in 0.026185 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部