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, "🚨 [C API 回调] 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[2]{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,建议开发者在真机或模拟器上验证多屏和隐私场景的逻辑正确性。 |