Skip to content

附2. 在小度设备上使用Camera

TokenChen edited this page Nov 27, 2020 · 4 revisions

1,小度设备Camera介绍

因为音箱设备特殊性(客厅/卧室等私人空间,设备常开),所以Camera权限非常敏感。对于普通三方App,不允许调用设备的Camera能力。为拦截未备案App调用Camera的行为,系统侧增加了额外的Camera权限白名单,非白名单应用无法调用Camera。

所以不要在未备案的情况下,尝试访问小度设备Camera(访问也访问不到),避免因为权限问题导致应用崩溃。如果经过百度PM评估确认,App场景确实需要访问Camera,开发者可以通过如下步骤开发调试Camera功能。

2,应用访问Camera流程

  1. 开发者技能申请上线。通知百度PM审核技能的时候,开通Camera访问权限;
技能提交上线
  1. 技能Camera和麦克风权限开通后,query打开技能,小度云端会下发允许调用Camera的权限配置。
度秘内网上线审核
  1. 设备收到云端下发的权限配置,会自动为App开启对应权限。因为Camera,麦克风,地理位置 等在Android M之后需要动态申请权限,所以动态权限申请的逻辑需要保留。

3,Camera是否禁用状态监测和处理

  1. 小度设备可以禁用Camera,在Camera被禁用的状态下,开发者即使拥有调用Camera的权限也无法使用Camera。所以监测当前Camera是否处于禁用状态,以及处理Camera禁用状态切换的逻辑,就显得至关重要。
  2. BotSdk通过DuerOSCapacity对外输出Camera状态读取和申请切换的能力。示例代码:
  • 2.1 获取Camera当前是否禁用状态
// 获取相机状态,此接应该在BotSdk初始化成功之后调用。BotSdk初始化完成之前,调用此接口不会有效果
BotSdk.getInstance().triggerDuerOSCapacity(BotMessageProtocol.DuerOSCapacity.AI_DUER_SHOW_GET_CAMERA_STATE, null);
  • 2.2 Camera状态的处理,如果当前处于禁用状态,则申请启用Camera

Camera状态通过通用消息HandleIntent通知给App.如果Camera从禁用变为启用状态,App应该处理重新初始化Camera的逻辑。

 @Override
    public void handleIntent(BotIntent intent, String customData) {
        Log.i(TAG, "intent is:" + intent + "customData:" + customData);
        if (intent != null && BotMessageProtocol.DUER_CAMERA_STATE_CHANGED_INTENT_NAME.equals(intent.name)) {
            if (BotMessageProtocol.DuerOSCapacityState.ENABLED.name().equals(customData)) {
                if (preState == BotMessageProtocol.DuerOSCapacityState.DISABLED) {
                    // 摄像头从不可用变为可用,重新初始化相机
                    preState = BotMessageProtocol.DuerOSCapacityState.ENABLED;
                    initCamera2();
                }
                Toast.makeText(this, "摄像头可用", Toast.LENGTH_LONG).show();
            } else if (BotMessageProtocol.DuerOSCapacityState.DISABLED.name().equals(customData)){
                // TODO release camera
                Toast.makeText(this, "摄像头不可用", Toast.LENGTH_LONG).show();
                preState = BotMessageProtocol.DuerOSCapacityState.DISABLED;
                BotSdk.getInstance().triggerDuerOSCapacity(BotMessageProtocol.DuerOSCapacity.AI_DUER_SHOW_REQUEST_ENABLE_CAMERA, null);
            }
        }
    }

4,一个CameraDemo(在小度设备验证通过)

https://github.com/TokenChen/CameraDemo