跨设备互通NDK开发指导
跨设备互通提供相机、扫描以及图库(图片和视频)的跨设备调用能力,TV、平板或2in1设备可以调用手机的相机、扫描、图库等功能,并且在6.1.0(23)之后支持TV、手机、平板或2in1设备调用支持拍照、扫描、选择图库中图片与视频能力的手机,支持拍照、扫描、选择图库中图片与视频能力的平板,以及支持选择图库中图片与视频能力的2in1设备。
场景介绍
您通过此能力实现跨设备交互,可以使用其他设备的相机、扫描和图库功能。
约束与限制
需同时满足以下条件,才能使用该功能:
-
设备限制
- 本端设备:HarmonyOS版本为HarmonyOS NEXT及以上的TV、平板或2in1设备。
- 远端设备:HarmonyOS版本为HarmonyOS NEXT及以上、具有相机能力的手机或平板设备。
-
使用限制
-
双端设备需要登录同一华为账号。
-
跨设备互通API支持根据特定调用策略调用设备。调用策略:TV、2in1设备可以调用平板和手机,平板可以调用手机,并且在6.1.0(23)之后支持TV、手机、平板或2in1设备调用支持拍照、扫描、选择图库中图片与视频能力的手机,支持拍照、扫描、选择图库中图片与视频能力的平板,以及支持选择图库中图片与视频能力的2in1设备。
-
双端设备需要打开WLAN和蓝牙开关。
条件允许时,建议双端设备接入同一个局域网,可提升唤醒相机的速度。
-
业务流程
- 通过HMS_ServiceCollaboration_GetCollaborationDeviceInfos接口获取设备能力列表。
- 通过HMS_ServiceCollaboration_StartCollaboration接口拉起跨设备互通能力。
- 对端设备确定回传后,本端处理对端回传的图片。
接口说明
在开发具体功能前,请先查阅参考文档。
| 接口名 | 描述 |
|---|---|
| HMS_ServiceCollaboration_GetCollaborationDeviceInfos | 获取跨设备互通可用的设备信息。 |
| HMS_ServiceCollaboration_StartCollaboration | 拉起跨设备互通能力,回传图片。 |
| HMS_ServiceCollaboration_StopCollaboration | 取消跨设备互通能力。 |
| HMS_ServiceCollaboration_StartCollaborationV2 | 拉起跨设备互通能力, 回传图片和视频 |
开发步骤
-
引入头文件。
#include "service_collaboration/service_collaboration_api.h" -
编写CMakeLists.txt。
find_library(# Sets the name of the path variable.service_collaboration-lib# Specifies the name of the NDK library that# you want CMake to locate.libservice_collaboration_ndk.z.so)target_link_libraries(entry PUBLIC${service_collaboration-lib}) -
实例代码调用接口,分为以下三步。
- 通过调用HMS_ServiceCollaboration_GetCollaborationDeviceInfos接口获取设备列表信息,传入需要的ServiceCollaborationFilterType能力数组,接口会返回支持对应能力设备。每个设备中包含所支持的能力类型ServiceCollaborationFilterTypes和设备类型deviceType信息。
- 创建回调ServiceCollaborationCallback,其中包括事件回调OnEventProc和图片数据回调OnDataCallbackProc;创建ServiceCollaboration_SelectInfo,示例中传入了TAKE_PHOTO能力,并选择了列表的第一个设备。
- HMS_ServiceCollaboration_StartCollaboration入参传入第二步构造的ServiceCollaborationCallback和ServiceCollaboration_SelectInfo,此时被调用的设备会拉起相机,操作被拉起相机的设备进行拍照。事件和图片数据会通过第二步构造的回调通知给应用。
#include "service_collaboration/service_collaboration_api.h"#include <thread>static int32_t OnEventProc(ServiceCollaborationEventCode code, uint32_t extraCode){return 0;}static int32_t OnDataCallbackProc(ServiceCollaborationEventCode code, ServiceCollaborationDataType dataType, uint32_t dataSize, char* data){return 0;}int main(int argc, char* argv[]){int two = 2;int three = 3;int filter = 1;const int size = 3;int shouldCancel = 0;// 构建所需跨设备互通能力,并调用HMS_ServiceCollaboration_GetCollaborationDeviceInfos接口获取设备信息ServiceCollaborationFilterType serviceFilterTypes[size] = {TAKE_PHOTO, SCAN_DOCUMENT, IMAGE_PICKER};ServiceCollaboration_CollaborationDeviceInfoSets* info = HMS_ServiceCollaboration_GetCollaborationDeviceInfos(3, serviceFilterTypes);// 构建callback回调ServiceCollaboration_SelectInfo taskInfo = { TAKE_PHOTO, { 0 } };for (uint32_t i = 0; i < info->size; i++) {ServiceCollaboration_CollaborationDeviceInfo *deviceInfo =(ServiceCollaboration_CollaborationDeviceInfo *)&(info->deviceInfoSets[i]);if (filter == 1) {taskInfo.serviceFilterType = TAKE_PHOTO;}if (filter == two) {taskInfo.serviceFilterType = SCAN_DOCUMENT;}if (filter == three) {taskInfo.serviceFilterType = IMAGE_PICKER;}std::memcpy(taskInfo.deviceNetworkId, deviceInfo->deviceNetworkId, COLLABORATIONDEVICEINFO_DEVICENETWORKID_MAXLENGTH-1);}ServiceCollaborationCallback callback = {.OnEvent = OnEventProc, .OnDataCallback = OnDataCallbackProc};// 传入拍照参数、callback回调并调用HMS_ServiceCollaboration_StartCollaboration接口uint32_t id = HMS_ServiceCollaboration_StartCollaboration(&taskInfo, &callback);std::this_thread::sleep_for(std::chrono::seconds(three));if (shouldCancel) {// 三秒后主动调用HMS_ServiceCollaboration_StopCollaboration关闭跨设备互通int32_t ret = HMS_ServiceCollaboration_StopCollaboration(id);}}