前言
上次說了下簡(jiǎn)單的框架構(gòu)架乓序,主要是解釋了下MVP的原理實(shí)現(xiàn)披坏。雖然上次的功能沒有很多,但主要是把框架搭好廉邑,才能更好的進(jìn)行下面的操作。如果還有不了解的可以先看下我前面的文章:Android高仿微信之mvp實(shí)現(xiàn)(一)
好了,這次我們要介紹的是微信聊天界面功能的簡(jiǎn)單實(shí)現(xiàn)蛛蒙。
原理
其實(shí)知道了原理你就會(huì)發(fā)現(xiàn)它是多么的簡(jiǎn)單糙箍。這里沒有服務(wù)器所以是基于推送實(shí)現(xiàn)的,網(wǎng)上也有一些這方面的資料牵祟,一般是基于百度云的深夯,我這里是基于小米推送來實(shí)現(xiàn)消息的傳遞。大家都知道現(xiàn)在推送無處不在诺苹,如果還沒有接觸推送的話咕晋,還是先去簡(jiǎn)單的補(bǔ)下功課在來看就能更好的了解下面說的。
要想實(shí)現(xiàn)消息的傳遞收奔,就要有發(fā)送與接收功能掌呜,首先對(duì)于接收so easy 了只要我們?cè)谧约旱?strong>Android應(yīng)用中集成小米的ISDK(我這里是以小米推送為例的)。就已經(jīng)實(shí)現(xiàn)的接收功能坪哄,對(duì)于接收我分了兩種质蕉,一種的正常聊天得信息,而另一種就是我們自己注冊(cè)時(shí)發(fā)送的信息损姜。對(duì)于第一種消息我們要根據(jù)用戶設(shè)備唯一標(biāo)識(shí)與用戶賬號(hào)來存儲(chǔ)下發(fā)過來的消息饰剥,為以后顯示不同用戶聊天記錄。對(duì)于第二中摧阅,是在我們使用時(shí)必須先注冊(cè)汰蓉,一旦注冊(cè)成功就會(huì)向所有的用戶發(fā)送一條注冊(cè)信息,該消息包括用戶的基本信息與設(shè)備標(biāo)識(shí)棒卷,只要在信息時(shí)間的有效時(shí)間之內(nèi)顾孽,注冊(cè)了得用戶就能接收該注冊(cè)消息。這個(gè)是很重要的身份識(shí)別比规,對(duì)消息的發(fā)送若厚,用戶的添加都是重要的標(biāo)識(shí)。說了接收蜒什,反過來發(fā)送也是一樣的分兩種测秸,只是旋轉(zhuǎn)一下位置而已。
配置小米SDK
首先進(jìn)入小米開發(fā)平臺(tái)灾常,為自己的應(yīng)用開啟推送功能霎冯,然后下載SDK根據(jù)官方文檔做好相應(yīng)的配置,前期就大功告成了钞瀑。
如果沒接觸過的只要耐心看文檔就沒什么問題沈撞,文檔很詳細(xì)
接收
前面我已經(jīng)說了接收是相對(duì)來說較簡(jiǎn)單的了,如果你前面配置好了小米的SDK雕什,那么你就有一個(gè)自定義的extends PushMessageReceiver的類缠俺,在該類中用各種相應(yīng)的接收信息方法显晶,對(duì)了忘了說消息的發(fā)送類型,這里分為兩種
- 通知欄顯示的消息
- 透?jìng)飨?/li>
通知欄顯示的消息不用我多說了壹士,至于透?jìng)飨⒑?jiǎn)單點(diǎn)就是不用通知欄顯示磷雇,直接在內(nèi)部接收發(fā)送過來的消息。
我們聊天使用的當(dāng)然的透?jìng)飨⒛关裕晕覀兛梢栽谙旅娴姆椒ㄖ薪邮盏酵競(jìng)靼l(fā)送過來的消息對(duì)于兩種接收消息做相應(yīng)的處理:
/**
* 接收服務(wù)器發(fā)送的透?jìng)飨? *
* @param context
* @param message
*/
@Override
public void onReceivePassThroughMessage(Context context, MiPushMessage message) {
mMessage = message.getContent();
if (!TextUtils.isEmpty(message.getTopic())) {
mTopic = message.getTopic();
} else if (!TextUtils.isEmpty(message.getAlias())) {
mAlias = message.getAlias();
}
Intent intent = new Intent();
//user information
if (mMessage.indexOf("^") != -1 && mMessage.indexOf("@") != -1) {
int index1 = mMessage.lastIndexOf("^");
int index2 = mMessage.lastIndexOf("@");
String userName = mMessage.substring(0, index1);
String regId = mMessage.substring(index1 + 1, index2);
String number = mMessage.substring(index2 + 1);
RegisterInfo info = new RegisterInfo();
info.setUserName(userName);
info.setNumber(number);
info.setRegId(regId);
RegisterDataHelper helper = new RegisterDataHelper(App.getAppContext());
Cursor cursor = helper.query(number, regId);
if (cursor != null && cursor.getCount() > 0) {
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
if (CursorUtils.formatString(cursor, RegisterDataHelper.RegisterDataInfo.REGID).equals(regId)
&& CursorUtils.formatString(cursor, RegisterDataHelper.RegisterDataInfo.NUMBER).equals(number)) {
if (!CursorUtils.formatString(cursor, RegisterDataHelper.RegisterDataInfo.USER_NAME).equals(userName))
// update user information
helper.update(info, number, regId);
cursor.close();
return;
}
}
cursor.close();
}
// insert user information
helper.insert(info);
if (SPUtils.getString("regId").equals(App.DEVELOPER_ID)){
WXDataHelper wxHelper = new WXDataHelper(App.getAppContext());
WXItemInfo itemInfo = new WXItemInfo();
itemInfo.setRegId(regId);
itemInfo.setTitle(userName);
itemInfo.setNumber(number);
itemInfo.setContent(String.format(App.HELLO_MESSAGE, userName));
itemInfo.setCurrentAccount(SPUtils.getString("userPhone"));
itemInfo.setTime(CalendarUtils.getCurrentDate());
wxHelper.insert(itemInfo);
}
} else {
// chat information
int index1 = mMessage.lastIndexOf("(");
String rMessage = mMessage.substring(0, index1);
String extraMessage = mMessage.substring(index1 + 1);
int index2 = extraMessage.indexOf("@");
int index3 = extraMessage.indexOf("@", index2 + 1);
String receiverNumber = extraMessage.substring(0, index2);
String regId = extraMessage.substring(index2 + 1, index3);
String sendNumber = extraMessage.substring(index3 + 1);
ChatMessageInfo chatMessageInfo = new ChatMessageInfo();
chatMessageInfo.setMessage(rMessage);
chatMessageInfo.setFlag(0);
chatMessageInfo.setTime(CalendarUtils.getCurrentDate());
chatMessageInfo.setReceiverNumber(receiverNumber);
chatMessageInfo.setRegId(regId);
chatMessageInfo.setSendNumber(sendNumber);
if (App.mNumber.equals(sendNumber) && App.mRegId.equals(regId)) {
//在當(dāng)前聊天界面
intent.setAction("com.idisfkj.hightcopywx.chat");
Bundle bundle = new Bundle();
bundle.putSerializable("chatMessageInfo", chatMessageInfo);
intent.putExtras(bundle);
App.getAppContext().sendBroadcast(intent);
} else {
//不在當(dāng)前聊天界面
ChatMessageDataHelper helper = new ChatMessageDataHelper(App.getAppContext());
helper.insert(chatMessageInfo);
}
}
}
代碼就不解釋了倦春,自己研究研究
發(fā)送
如果你看了文檔的話就應(yīng)該有點(diǎn)頭緒了,發(fā)送就是使用HTTP請(qǐng)求向小米所提供的API根據(jù)你提供的regId落剪、userAccount睁本、alias、topic等發(fā)送你要發(fā)送的消息內(nèi)容忠怖,我用的是regId API:https://api.xmpush.xiaomi.com/v2/message/regid
下面是發(fā)送代碼:
@Override
public void requestData(final requestListener listener, final String chatContent, final String number, final String regId, final ChatMessageDataHelper helper) {
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, UrlUtils.ChatUrl(chatContent, number, regId)
, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject jsonObject) {
mChatMessageInfo = new ChatMessageInfo();
mChatMessageInfo.setMessage(chatContent);
mChatMessageInfo.setFlag(1);
mChatMessageInfo.setTime(CalendarUtils.getCurrentDate());
mChatMessageInfo.setReceiverNumber(number);
mChatMessageInfo.setRegId(regId);
mChatMessageInfo.setSendNumber(SPUtils.getString("userPhone", ""));
listener.onSucceed(mChatMessageInfo, helper);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Log.d("TAG", volleyError.getMessage());
listener.onError(volleyError.getMessage());
}
}) {
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap<String, String> header = new HashMap<>();
header.put("Authorization", "key=" + App.APP_SECRET_KEY);
return header;
}
};
VolleyUtils.addQueue(jsonObjectRequest, "chatRequest");
}
由于涉及的代碼還是有點(diǎn)多的呢堰,這里就不一一展開,有興趣的可以自己根據(jù)后面的地址Star凡泣、Fork下載代碼查看枉疼。
如果你安裝注冊(cè)了,由于時(shí)間原因鞋拟,目前聊天界面只會(huì)自動(dòng)添加我為好友骂维,你們?nèi)绻貌欢每梢院?jiǎn)單的發(fā)消息給我,但不一定都會(huì)回贺纲。好了航闺,下面看看效果吧
效果圖
項(xiàng)目地址:https://github.com/idisfkj/HightCopyWX