DVKit,即DeviceVirtualization Kit(多设备虚拟化平台),是通过虚拟化技术将相关设备或器件打造成手机器件或能力的延生,通过将便携式,可穿戴的Drift 运动相机Ghost 4K+ 虚拟成手机除前置,后置相机的第三个相机,可以实现以手机为中心的全场景体验和应用。

使用Drift Ghost 4+ 作为手机App的延展功能带来的6大优势:

  • Ghost 4K+ 与华为EMUI10.1实现系统级自动发现和连接,与手机摄像头可无缝切换。
  • 不占用手机正常的Wi-Fi和蓝牙通道,完全符合主流App的使用习惯。
  • 140度广角,全高清视频流。
  • 脱离手机,10米范围内稳定的无线连接。 
  • 众多配件加持,实现更多解放双手应用。
  • 开发简单,无需任何硬件知识,几行代码(已开源)即可在现有App上集成Ghost 4K+。


下面详细介绍下在EMUI10.1 系统下开发适配Drift Ghost 4K+ App的流程。

1.注册认证华为帐号

登录华为开发者联盟官网(https://developer.huawei.com/consumer/cn/),帐号必须实名认证,如您还没有华为帐号,请先进行注册。

2.签署协议

签署SDK包中的《华为DeviceVirtualization设备虚拟化服务协议》。

3.SDK下载

登录华为开发者联盟官网>“开发”>“DeviceVirtualization Kit”>点击“下载SDK”,下载SDK压缩包。

4.环境准备与搭建

建议v3.0.1及以上Android Studio。 Beta及以上DevEco Studio; 手机系统软件不低于EMUI10.1.0。

5.DVKit Demo介绍

5.1Demo运行

由于华为开发账户和DVKit权限审核需要大概一周的时间,我们提供了一个可以测试App供开发者运行调试。(注意:此App ID不可用于商用)点击此链接DVKitDemo可下载,运行效果如下: 


5.2 Demo关键代码

5.2.1 连接服务

应用在需要使用DV Kit能力时,首先需要进行初始化连接DV Kit服务,服务初始化结果会通过onConnect回调返回。

当服务断开或异常,会通过onDisconnect回调返回。

在连接成功后调用getKitService来获取VirtualDeviceManager服务实例,用于控制虚拟设备。

当DVKit服务异常时,onDisconnect回调接口会通知应用,应用此时可以重新进行连接并且清理设备连接状态,或者根据业务需要进行处理。


  • //获取DvKit对象并连接DvKit服务 


  • DvKit.getInstance().connect(getApplicationContext(), new IDvKitConnectCallback() { 


  •    //服务连接成功后的回调通知 


  •    @Override 


  •    public void onConnect(int result) { 


  •        addLog("msdp service connect"); 


  •        mVirtualDeviceManager = (VirtualDeviceManager)        DvKit.getInstance().getKitService(VIRTUAL_DEVICE_CLASS); 


  •        mVirtualDeviceManager.subscribe(EnumSet.of(VIRTUALDEVICE), observer); 


  •    } 


  •    //服务断开后的回调通知 


  •    @Override 


  •    public void onDisconnect() { 


  •        addLog("msdp service disconnect"); 


  •    } 


  • });


5.2.2 设备发现

当DVKit服务初始化连接成功并且获取到VirtualDeviceManager服务后,应用可以调用VirtualDeviceManager服务的startDiscovery接口用于发现周边可用设备。发现的设备会通过IDiscoveryCallback回调的onFound接口返回。


  • //开始发现设备 


  • mVirtualDeviceManager.startDiscovery(new IDiscoveryCallback() { 


  •    //设备发现时的回调接口 


  •    @Override 


  •    public void onFound(VirtualDevice device, int state) { 


  •        if (device == null) { 


  •            addLog("onDevice callback but device is null"); 


  •        } else { 


  •            HwLog.d(TAG, "onDevice Found: " + Util.hideSensitiveInfo(device.getDeviceId()) + " Name: " 


  •                + device.getDeviceName() + " Type:" + device.getDeviceType()); 


  •            if (!mVirtualDeviceMap.containsKey(device.getDeviceId())) { 


  •                addLog("onDevice Found: " + device.getDeviceId() + " Name: " + device.getDeviceName() + " Type:" 


  •                    + device.getDeviceType()); 


  •                mVirtualDeviceMap.put(device.getDeviceId(), device); 


  •                handler.sendMessage(handler.obtainMessage(DEVICE_ADD, device)); 


  •            } 


  •        } 


  •    } 


  •    //发现状态变更的回调通知 


  •    @Override 


  •    public void onState(int state) { 


  •    } 


  • });


5.2.3设备能力使能

当发现到虚拟设备后,应用可以调用虚拟设备的getDeviceCapability()接口获取设备支持的能力,并且根据业务需要有选择的使能设备的能力。

应用可以通过调用enableVirtualDevice来使能所需要使能的设备以及能力,如果需要同时使能设备多个能力,可以同时传入多个能力。

应用使能的结果可以通过subscribe接口传入的回调对象获得。


  • mVirtualDeviceManager.enableVirtualDevice(deviceId, EnumSet.of(CAMARA), null); 


  • //调用subscribe时传入的observer对象 


  • private IVirtualDeviceObserver observer = new IVirtualDeviceObserver() { 


  •    //虚拟设备状态变化时的回调通知 


  •    @Override 


  •    public void onDeviceStateChange(VirtualDevice virtualDevice, int returncode) { 


  •    } 


  •    //虚拟设备能力状态变化时的回调通知 


  •    @Override 


  •    public void onDeviceCapabilityStateChange(VirtualDevice virtualDevice, Capability capability, int returncode) { 


  •        if (returncode == EventType.EVENT_DEVICE_CAPABILITY_ENABLE) { 


  •            //当设备能力使能成功时,应用处理使能成功流程 


  •            onEnable(virtualDevice, capability); 


  •        } else if (returncode == EventType.EVENT_DEVICE_CAPABILITY_DISABLE) { 


  •            //当设备能力去使能成功时,应用处理去使能成功流程 


  •            onDisable(virtualDevice, capability); 


  •        } else { 


  •            //当虚拟设备能力状态异常时,应用应处理异常流程 


  •            onError(virtualDevice, capability, returncode); 


  •        } 


  •    } 


  • };


5.2.4 虚拟Camera能力

使用如下代码即可使能设备的虚拟Camera能力

mVirtualDeviceManager.enableVirtualDevice(deviceId, EnumSet.of(CAMERA), null);

虚拟Camera能力使能后,应用可以通过getData接口获取虚拟设备上虚拟Camera的id。和本地前后置摄像头一样,应用可以通过Android的getCameraCharacteristics接口获取虚拟Camera的属性信息,以及通过Android的openCamera接口打开虚拟Camera。


  • //通过虚拟设备的getData接口获取设备虚拟Camera的ID 


  • String cameraId = device.getData(Constants.ANDROID_CAMERAID_FRONT); 


  • //使用CameraManager的getCameraCharacteristics接口获取虚拟Camera的属性信息 


  • CameraManager manager = (CameraManager)getSystemService(Context.CAMERA_SERVICE); 


  • CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId); 


  • //使用CameraManager的openCamera接口打开虚拟Camera 


  • manager.openCamera(cameraId, mStateCallback, null)


当前虚拟Camera仅支持预览的基本方法,不支持拍照和录像场景,对于Camera预览中的参数配置,仅支持运行中配置帧率。如果应用有其他场景应用,可联系我们。

支持的功能点包括以下:


  • CameraManager.getCameraCharacteristics()


  • CameraManager.openCamera()


  • CameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW)


  • CameraDevice.createCaptureSession()


  • CameraCaptureSession.setRepeatingRequest()


  • CameraDevice.close()


  • CameraCaptureSession.close()


文档更新时间: 2021-09-02 16:30   作者:foreamdoc