功能解释
UserEvent网关事件是通过向天猫精灵网关上报事件,触发技能端的调用。
注意:由于本地调试不带技能信息,该功能测试,必须将包上传到技能平台,进行真机测试绑定,然后通过语音唤起应用
DOM切面方式上报UserEvent
指定onTap为$userEvent情况下,框架自动会按照UserEvent上报,更加快捷
<div class="operation-button" onTap="$userEvent" data-action="home-action1">界面1-进功能</div>
对应的字段为
| type | 自动填充标签 | 当前事件的类型,默认为click |
|---|---|---|
| target.dataset | 自动填充data- | 参考web:https://developer.mozilla.org/zh-CN/docs/Web/API/HTMLOrForeignElement/dataset |
| target.tagName | 自动填充当前标签名 | 如div, image等 |
| timestamp | 自动填充 | 事件触发的时间 |
dom切面自动上报的数据格式
{"eventDomain":"AliGenie.Routine","eventName":"EventIssued","eventData":{"eventIssuedContext":{"eventDetail":{"type":"click","target":{"dataset":{"action":"home-action1"},"tagName":"div"},"timeStamp":1626062006132},"coinEventNs":"ScreenScene","coinEventName":"UserEvent"}}}
调用接口自定义上报UserEvent
axml标签
<div class="operation-button" onTap="operationButtonTap" data-action="home-action1">界面1-进功能</div>
as逻辑代码
this.addEventListener("operationButtonTap", (e: Event)=>{// 携带点击事件的dom信息的初始化方法,节点信息会携带到target里// const userEvent = UserEvent.initWithEvent(e);// 初始化UserEventconst userEvent = new UserEvent("operationButtonTap");userEvent.data.set("action","home-action1");agui.sendUserEvent(userEvent);});
自定义上报数据格式:
{"eventDomain":"AliGenie.Routine","eventName":"EventIssued","eventData":{"eventIssuedContext":{"eventDetail":{"type":"operationButtonTap","data":{"action":"home-action1"}},"coinEventNs":"ScreenScene","coinEventName":"UserEvent"}}}
技能端接收处理方式:
权限开通
意图触发
注意:只有默认意图会接收到网关事件
处理逻辑(以Java为例)
@Beanpublic Function<String, String> carTestFunction(Context context) {logger = context.getLogger();return it -> {try {String action = null;logger.log("wph_card_test param : " + it);if(StringUtils.isBlank(it)){return speak(1,it);}Map itMap = JSON.parseObject(it, Map.class);if(itMap==null || null==itMap.get("requestInfo")){return speak(2,itMap);}// 获取requestInfoMapMap requestInfoMap = (Map) itMap.get("requestInfo");if(requestInfoMap==null || null==requestInfoMap.get("requestData")){return speak(3,requestInfoMap);}//语音 - 讲故事if(isSpeakStory(requestInfoMap)){return render(Contants.two_page);}//语音 - 不玩了if(noMore(requestInfoMap)){return render(Contants.one_page);}// 获取requestDataMap requestDataMap = (Map) requestInfoMap.get("requestData");if(requestDataMap==null ){return speak(4,requestDataMap);}String jsonStr = Contants.default_render;// 获取eventDetail里的信息,进行判断Map<String, String> requestData = requestDataMap;String eventIssuedContext = requestData.get("eventIssuedContext");if (StringUtils.isNotBlank(it) && itMap != null && requestInfoMap != null && requestDataMap != null&&StringUtils.isNotBlank(eventIssuedContext)) {if(eventIssuedContext==null ){return speak(5,eventIssuedContext);}Map targetMap = JSON.parseObject(eventIssuedContext, Map.class);if(targetMap==null || null == targetMap.get("eventDetail")){return speak(6,targetMap);}// 获取eventDetail里的信息,进行判断JSONObject eventDetailJsonObject = (JSONObject) targetMap.get("eventDetail");if(eventDetailJsonObject==null || null == eventDetailJsonObject.get("target")){return speak(7,eventDetailJsonObject);}JSONObject targetJsonObj = (JSONObject) eventDetailJsonObject.get("target");if(targetJsonObj==null || null == targetJsonObj.get("dataset")){return speak(8,targetJsonObj);}// 对dataSet(dom上绑定的信息)进行判断JSONObject dataset2 = (JSONObject) targetJsonObj.get("dataset");action = dataset2.getString("action");logger.log("进入卡片测试技能-wph-action:{}" + action);if ("home-action1".equals(action)) {jsonStr = Contants.two_page;} else if ("detail-action1".equals(action)) {jsonStr = Contants.one_page;} else {//播放语音PlayTtsCommand tts = FaasSkillResponseUtils.buildTtsCommand("我还不明白你要干什么wph正常播报", true);tts.setWakeupType("continuity");FaasSkillResponse.FaasSkillResponseBuilder builder = FaasSkillResponse.builder();builder.commands(Arrays.asList(tts));ResultModel<TaskResult> taskResultResultModel = outputForCardTest(builder.build());TaskResult returnValue = taskResultResultModel.getReturnValue();return JSON.toJSONString(returnValue);}}logger.log("进入卡片测试技能-wph");return render(jsonStr);} catch (Exception e) {e.printStackTrace();logger.log("解析json错误:" + e.getMessage());return speakMsg("我还不明白你要干什么wph异常播报异常信息" +e.getMessage());}};}
/*** 是否讲故事* @param requestInfoMap* @author wph01011689* @date 2021/7/5 12:45* @Return boolean*/public boolean isSpeakStory(Map requestInfoMap){String utterance = (String) requestInfoMap.get("utterance");if(StringUtils.isBlank(utterance)){return false;}if("讲故事".equals(utterance.trim()) || utterance.trim().contains("讲故事")){return true;}return false;}
