3.1 灵聚SDK
<br/><p>
* 灵聚SDK是一套集语义解析、智能处理以及提供业务接入于一体的通用型SDK。为智能机器人、智能硬件类产品提供良好的人机自然交互能力,具有拟人化智能与思维能力。
### 初始化
* * * * *
调用AndroidChatRobotBuilder.create( )设置各项参数,初始化灵聚智能引擎,及聊天机器人类ChatRobot的实例。
~~~
AndroidChatRobotBuilder.create(Context, "appkey")
.setMusicContext(musicContext)
.setLocationAdapter(locationAdapter)
.setNetworkAdapter(networkAdapter)
.build(new ChatRobotBuilder.RobotInitListener() {
@Override
public void initComplete(int i) {
if (i == 0) { //初始化成功
chat = AndroidChatRobotBuilder.get().robot();
if (AppConfig.NewInstallFirstOpen)
//合并(更新)服务器数据
mergeServerData();
}
}
});
~~~
初始化参数说明:
* appkey:本项目对于SDK的唯一标识,可到[灵聚开发者平台](http://open.lingju.ai)注册申请。
* MusicContext:音乐播放的上下文接口,该接口允许用户点播本地的歌曲及更智能地进行音乐播放的语音交互,如开发者无此需求则无需传入。
* LocationAdapter:定位适配,实时读取设备当前的位置,用于支持周边POI查询,出行查询,天气查询等,不传入则这一系列查询均无法正常使用。
* NetworkAdapter:网络监听适配,实时读取设备当前的网络状态,用于实时切换在线及离线引擎。
### 对话
* * * * *
* 问题输入,使用IChatRobot的
~~~
void process(String var1, ResponseCallBack var2)
~~~
可向robot发送对话。
* 应答输出,在ResponseCallBack的
~~~
public void onResult(IChatResult r)
~~~
可获得robot的应答回复。
### 数据同步更新上传操作(可选操作)
* * * * *
* 数据同步更新上传是针对备忘、提醒、闹钟、记账、录音等功能的数据操作,对这些功能生成的对应的备忘数据、提醒数据、闹钟数据、记账数据、录音数据的新建、删除、修改、查询操作时需要将本地的数据与服务端的数据同步。备忘、提醒、闹钟、记账、录音在sdk中定义了相应的实体类,分别为MemoEntity、RemindEntity、AlarmClockEntity、BillEntity、TapeEntity。这些实体类都继承自SyncSegment。
SyncSegment中包含的同步属性(**本地记录上传时必须提供**)如下所示:
~~~
/** 服务端对应记录的ID */
protected String sid;
/** 本地记录的ID */
protected int lid;
/** 时间戳(服务端返回),版本号 */
protected long timestamp;
/** 回收状态,0=可用,1=回收站 */
protected int recyle;
/** 是否已经同步 */
protected transient boolean synced;
~~~
**同步更新上传示例:以提醒为例**
1. 定义一个类实现同步接口:`interface SyncDao<T extends SyncSegment>`
~~~
/**
* 提醒动作对象同步操作Dao实现
**/
public class RemindEntityDao implements SyncDao<RemindEntity> {
@Override
public int getTargetId() {
//targetId:动作对象id,提醒(RemindEntity)为308。
return RobotConstant.ACTION_REMIND;
}
/**
* 获取目前对象的实体类
*/
@Override
public Class<RemindEntity> getTargetClass() {
return RemindEntity.class;
}
/**
* 获取本地记录中最大的同步时间戳
*/
@Override
public long getLastTimestamp() {
long t = 0;
Remind remind = 以timestamp倒序排列,查找数据库第一条提醒记录;
if (remind !=null)
t = remind.getTimeStamp();
return t;
}
/**
* 合并服务端的数据,合并策略(永远以服务端数据为优先):
* 1.本地含有相同lid的记录:覆盖合并到本地记录;
* 2.本地没有相同lid的记录,插入本地记录;
* @return true:合并成功,false:SDK将会调用{@linkplain SyncDao#mergeServerData(List) mergeServerData(List)}处理
*/
@Override
public boolean mergeServerData(JsonArray jsonArray) {
System.out.println("Remind mergeServerData>>" + jsonArray);
return false;
}
/**
* 合并服务端的数据,合并策略(永远以服务端数据为优先):
* 1.本地含有相同lid的记录:覆盖本地记录;
* 2.本地没有相同lid的记录,插入本地记录;
* @param data
* @return true:合并成功
*/
@Override
public boolean mergeServerData(List<RemindEntity> list) {
if (list != null && list.size() > 0){
//TODO 第一步:本地合并服务端返回的数据
//第二步:由于服务器端一次最多只能合并100条数据,合并数据后需要再递归请求数据刷新,保证所有云端数据合并完毕
AndroidChatRobotBuilder.get().robot().actionTargetAccessor().syncUpdate(this);
}
return true;
}
/**
* 查询未同步的本地记录
* @param size 返回的最大长度
* @return
*/
@Override
public List<RemindEntity> getUnSyncLocalData(int size) {
List<RemindEntity> list = new ArrayList<>();
//TODO 获取数据库所有记录,并将synced = false(未同步)的记录加入list中;
//注意:由于服务器端有记录上传限制,所以list的最大容量建议<= 500。
return list;
}
/**
* 查询未同步的本地记录的总数
* @return
*/
@Override
public int getUnsyncLocalDataCount() {
int c = 获取数据库中synced = false(即未同步)的记录总数;
return c;
}
/**
* 查询未同步的本地记录
* @param size 返回的最大长度
* @return null:SDK将会调用{@linkplain SyncDao#getUnSyncLocalData() getUnSyncLocalData()}查询
*/
@Override
public JsonArray getUnSyncLocalDataAsJsonArray(int size) {
return null;
}
}
~~~
2. 在需要同步的地方调用同步方法:ActionTargetAccessor类的 boolean sync(SyncDao var1);
例如,本地删除提醒记录(建立同步机制后,删除并非直接清除该记录,而是设置删除标记表示已删除)
① 设置删除标记和待同步标记,保存记录(delRemind:要删除的提醒对象)
~~~
//synced:同步标记(true 已同步 false 待同步)
delRemind.setSynced(false);
//recyle:删除标记(0 有效记录 1 已删除记录)
delRemind.setRecyle(1);
//TODO 保存delRemind对象到本地数据库中,update方法需开发者实现
update(delRemind);
~~~
② 本地保存后需更新同步到云端
~~~
//同步方法,注意mRemindEntityDao所有查询相关的方法必须能够查询到最新状态的记录,否则该同步方法将失败
AndroidChatRobotBuilder.get().robot().actionTargetAccessor().sync(mRemindEntityDao);
~~~