功能解释
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);
// 初始化UserEvent
const 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为例)
@Bean
public 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);
}
// 获取requestInfoMap
Map 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);
}
// 获取requestData
Map 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;
}