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()