正常的思路是
服務端設置一個機器人,當有接收到消息的時候,自動回復一條消息。
比如大名鼎鼎的微軟小冰:

小冰會根據(jù)消息類型和語境回答最接近的消息,現(xiàn)在還能分析圖片,比如一個合照能識別大致年齡等。
當然這是高級智能化的結(jié)果。
自己在寫一個聊天項目的時候,也想到寫一個自動回復的機器人。
但是跟小冰比真是太low了,玩玩全全就是個機器。

其實在包含通訊類的項目中應用的還是比較多的。
比如在很多app需要通訊或者客服的功能。
當我們?nèi)ゴ蜷_對話窗口的時候,首先發(fā)送出去的消息會默認先去匹配相關的文章,解決方案。只有在我們選擇人工的時候才會給我們接入客服。
其實這樣一方面也解決的客服人員的工作壓力。
下面進入正題
由于自己技術能力有限,只能實現(xiàn)客戶端的邏輯。勉強也算實現(xiàn)了。
服務端使用的是極光的JMessage。
簡單實現(xiàn):
1、接收消息
需要在OnCreate初始化的時候注冊消息事件
JMessageClient.registerEventReceiver(this);
在onDestroy()結(jié)束的時候銷毀
JMessageClient.unRegisterEventReceiver(this);
然后重寫onEvent類(該類是極光開發(fā)提供的接收消息的方法)
MessageEvent是消息接收的類,可以判斷消息類型,比如在這里就沒有做判斷。所有類型的消息都是默認以text的方式回復。
JMessageClient.getMyInfo().getUserName()=="1006"
這里就是設置機器人的編號了?;蛘哒f算是用戶名吧,系統(tǒng)根據(jù)這個判斷是否是機器人。
然后使用
JMessageClient.createSingleTextMessage(msg.getTargetID(), "", "[自動回復]你好,我是機器人");
創(chuàng)建一條消息,需要三個參數(shù)(目標ID,appKey,內(nèi)容)
目標ID是根據(jù)接收到消息,獲取發(fā)送者的id,
appKey可以用于不同app之間的通訊。
內(nèi)容是我們回復的內(nèi)容。
使用JMessageClient.sendMessage(message1);發(fā)送就行了
如果需要監(jiān)聽消息發(fā)送結(jié)果的回調(diào),使用setOnSendCompleteCallback
/*接收消息*/
public void onEvent(final MessageEvent event) {
final Message msg = event.getMessage();
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
if (JMessageClient.getMyInfo().getUserName()=="1006"|| JMessageClient.getMyInfo().getUserName().equals("1006")) {
final Message message1 = JMessageClient.createSingleTextMessage(msg.getTargetID(), "", "[自動回復]你好,我是機器人");
message1.setOnSendCompleteCallback(new BasicCallback() {
@Override
public void gotResult(int i, String s) {
if (i == 0) {
Log.e("Log:自動回復:", s + "");
} else {
}
}
});
JMessageClient.sendMessage(message1);
}
adapter.clear();
initDataBean();
}
});
}
如果需要設置高級的回復功能
需要在接收到消息后先判斷消息的類型,或者監(jiān)聽收到消息的文字,本地做識別處理之后再自動發(fā)送回去。
當然如果想把機器人的回復設置的更加生動,可以手動去設置一些隨機的回復。看起來至少沒那么干。
當然如果你想避免某人的打擾,也可以設置對此人采用自動回復,
只要在接收消息里判斷發(fā)送方的id就可以了。
目前的實現(xiàn)是為了方便觀看效果,所以有一定的局限性,比如當離線的時候是無法發(fā)送消息的?;蛘咄顺鯽pp也不行。
項目地址:https://github.com/wapchief/Android-IM
相關閱讀推薦: