-
Notifications
You must be signed in to change notification settings - Fork 22
附2. 在小度设备上使用Camera
TokenChen edited this page Nov 27, 2020
·
4 revisions
因为音箱设备特殊性(客厅/卧室等私人空间,设备常开),所以Camera权限非常敏感。对于普通三方App,不允许调用设备的Camera能力。为拦截未备案App调用Camera的行为,系统侧增加了额外的Camera权限白名单,非白名单应用无法调用Camera。
所以不要在未备案的情况下,尝试访问小度设备Camera(访问也访问不到),避免因为权限问题导致应用崩溃。如果经过百度PM评估确认,App场景确实需要访问Camera,开发者可以通过如下步骤开发调试Camera功能。
- 开发者技能申请上线。通知百度PM审核技能的时候,开通Camera访问权限;

- 技能Camera和麦克风权限开通后,query打开技能,小度云端会下发允许调用Camera的权限配置。

- 设备收到云端下发的权限配置,会自动为App开启对应权限。因为Camera,麦克风,地理位置 等在Android M之后需要动态申请权限,所以动态权限申请的逻辑需要保留。
- 小度设备可以禁用Camera,在Camera被禁用的状态下,开发者即使拥有调用Camera的权限也无法使用Camera。所以监测当前Camera是否处于禁用状态,以及处理Camera禁用状态切换的逻辑,就显得至关重要。
- 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);
}
}
}