Android-IM使用imui組件結(jié)合JMessage實(shí)現(xiàn)即時(shí)消息對話

項(xiàng)目源碼請參考 Android-IM
項(xiàng)目服務(wù)端使用極光JMessage
對話列表使用aurora-imui開源組件

簡介

imui

是極光在GitHub上開源的一個(gè)即時(shí)通訊庫,方便開發(fā)者快速使用,完成即時(shí)通訊類的對話展示。目前支持Android册养、iOS、React Native三大平臺。

該庫在Android端包括兩大控件

1.MessageList
展示的對話列表炉抒,支持自定義ViewHolder布局
導(dǎo)入方式:

compile 'cn.jiguang.imui:messagelist:0.4.6'

2.ChatInputView
消息輸入方式,比如語音稚叹,圖片焰薄,位置等
導(dǎo)入方式:

compile 'cn.jiguang.imui:chatinput:0.4.6'

JMessage

是極光提供的sdk服務(wù),用于接收和轉(zhuǎn)發(fā)消息扒袖。也是項(xiàng)目中最重要的部分塞茅。
集成方式建議直接參考文檔,已經(jīng)很詳細(xì)了:JMessage Android SDK 集成指南

開始前的準(zhǔn)備

1.在布局中加入控件
關(guān)于一些常用的屬性季率,比如發(fā)送方或者接收方的字體大小顏色等野瘦,可以手動設(shè)置。

        <cn.jiguang.imui.messages.MessageList
            android:id="@+id/msg_list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:avatarHeight="48dp"
            app:avatarWidth="48dp"
            app:bubbleMaxWidth="0.70"
            app:dateTextSize="14sp"
            app:receiveBubblePaddingLeft="16dp"
            app:receiveBubblePaddingRight="8dp"
            app:receiveTextColor="#ffffff"
            app:receiveTextSize="14sp"
            app:sendBubblePaddingLeft="8dp"
            app:sendBubblePaddingRight="16dp"
            app:sendTextColor="#7587A8"
            app:sendTextSize="14sp" />

2.創(chuàng)建消息實(shí)體MyMessage
展示和解析消息的類飒泻,必須要實(shí)現(xiàn)IMessage接口鞭光。
因?yàn)檫@里需要解析極光服務(wù)端的消息,所以需要添加一個(gè)內(nèi)部Message的解析泞遗。

public class MyMessage implements IMessage {

    private long id;
    private String text;
    private String timeString;
    private MessageType type;
    private IUser user;
    private String mediaFilePath;
    private long duration;
    private String progress;
    private Message message;
    private int position;
    private long msgID;

    public MyMessage(String text, MessageType type) {
        this.text = text;
        this.type = type;
        this.id = UUID.randomUUID().getLeastSignificantBits();
    }
......
//省略get惰许、set方法
}

3.實(shí)現(xiàn)IUser接口
用戶頭像,id史辙,用戶名等參數(shù)

public class DefaultUser implements IUser {

    private String id;
    private String displayName;
    private String avatar;

    public DefaultUser(String id, String displayName, String avatar) {
        this.id = id;
        this.displayName = displayName;
        this.avatar = avatar;
    }

創(chuàng)建消息

這里的創(chuàng)建消息并不是單單指消息的發(fā)送汹买,包括消息的接收,展示等都需要手動去創(chuàng)建消息聊倔,以便于展示晦毙。

其實(shí)消息列表就是由多個(gè)MyMessage得到的。

1.創(chuàng)建展示的消息

創(chuàng)建消息需要兩個(gè)參數(shù)方库,一個(gè)是要展示的消息類型:

i

另一個(gè)參數(shù)是設(shè)置發(fā)送方或者接收方的位置和類型

MyMessage myMessage = new MyMessage(((TextContent) message.getContent()).getText(), IMessage.MessageType.RECEIVE_TEXT);

由于不同的類型需要不同的解析结序,所以如果類型出錯就會崩潰。

2.創(chuàng)建展示的對話用戶信息

setUserInfo需要一個(gè)IUser的參數(shù)類型纵潦。
DefaultUser需要的參數(shù)分別是當(dāng)前登錄的用戶名徐鹤、顯示的名稱、頭像

myMessage.setUserInfo(new DefaultUser(JMessageClient.getMyInfo().getUserName(), "DeadPool", imgRecrive));

發(fā)送消息

注意要區(qū)分Message和MyMessage:
Message是用來上傳邀层,發(fā)送消息的返敬,是sdk指定的唯一消息類型。
而MyMessage是UI指定的消息類寥院,所以兩者之間需要經(jīng)常轉(zhuǎn)換劲赠。


    private void sendMessage(String msg) {
        //創(chuàng)建文本消息
        TextContent content = new TextContent(msg);
        //獲取創(chuàng)建的消息
        Message message1 = conversation.createSendMessage(content);
        //創(chuàng)建展示的本地消息
        final MyMessage myMessage = new MyMessage(msg, SEND_TEXT);
        myMessage.setMessage(message1);
        myMessage.setTimeString(TimeUtils.ms2date("MM-dd HH:mm", message1.getCreateTime()));
        myMessage.setUserInfo(new DefaultUser(JMessageClient.getMyInfo().getUserName(), "DeadPool", imgSend));
        //返回的結(jié)果
        message1.setOnSendCompleteCallback(new BasicCallback() {
            @Override
            public void gotResult(int i, String s) {
                if (i == 0) {
                    //將消息添加到本地視圖
                    mAdapter.addToStart(myMessage, true);
                    mChatEt.setText("");
                } else {
                }
            }
        });
        //向服務(wù)器發(fā)送消息
        JMessageClient.sendMessage(message1);

adapter不需要手動創(chuàng)建只需在開始的時(shí)候調(diào)用:
username:當(dāng)前用戶名
holder:自定義的viewholder,為空則使用默認(rèn)的布局
iamge:當(dāng)前的用戶頭像(發(fā)送方)

MsgListAdapter adapter = new MsgListAdapter<>(userName, holdersConfig, imageLoader);
messageList.setAdapter(adapter);

接收消息

onEvent是固定的寫法,參數(shù)有幾種類型
MessageEvent只負(fù)責(zé)接收消息事件凛澎。
比如消息撤回事件就是MessageRetractEvent霹肝。
但是都需要先通過Message解析消息,然后再使用MyMessage解析到本地塑煎,用于UI的展示

  /*接收到的消息*/
    public void onEvent(MessageEvent event) {
        final Message message = event.getMessage();

        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                //創(chuàng)建一個(gè)消息對象
                MyMessage myMessage = new MyMessage(((TextContent) message.getContent()).getText(), IMessage.MessageType.RECEIVE_TEXT);
                myMessage.setMessage(message);
                myMessage.setMsgID(message.getServerMessageId());
                myMessage.setText(((TextContent) message.getContent()).getText() + "");
                myMessage.setTimeString(TimeUtils.ms2date("MM-dd HH:mm", message.getCreateTime()));
                myMessage.setUserInfo(new DefaultUser(JMessageClient.getMyInfo().getUserName(), "DeadPool", imgRecrive));

                if (message.getContentType() == ContentType.text || message.getContentType().equals("text")) {
                    mAdapter.addToStart(myMessage, true);
                    mAdapter.notifyDataSetChanged();
                }
                //收到消息時(shí)沫换,添加到集合
                list.add(myMessage);
            }

        });
    }

其它消息事件:
比如全局監(jiān)聽重復(fù)登錄事件,需要在根Activity處理最铁。

監(jiān)聽事件

1.點(diǎn)擊頭像的監(jiān)聽
setOnAvatarClickListener是封裝在Messagelist控件里的方法讯赏,可以直接拿來用。
一般分為兩種冷尉,發(fā)送方的頭像和接收方的頭像
在執(zhí)行相應(yīng)跳轉(zhuǎn)的時(shí)候要進(jìn)行消息方的判斷漱挎。

 //點(diǎn)擊頭像
        mAdapter.setOnAvatarClickListener(new MsgListAdapter.OnAvatarClickListener<MyMessage>() {
            @Override
            public void onAvatarClick(MyMessage message) {
                DefaultUser userInfo = (DefaultUser) message.getFromUser();
                Intent intent;
                if (message.getType() == SEND_TEXT) {
                    intent = new Intent(mContext, UserActivty.class);
                } else {
                    intent = new Intent(mContext, UserInfoActivity.class);
                    intent.putExtra("USERNAME", userName);
                }
                Log.e("userName", userInfo + "\n" + userName);
                startActivity(intent);
            }
        });

2.單擊消息

單擊消息事件,可以選擇查看大圖或者播放視頻雀哨,播放語音文件等操作


        mAdapter.setOnMsgClickListener(new MsgListAdapter.OnMsgClickListener<MyMessage>() {
            @Override
            public void onMessageClick(MyMessage message) {
                // do something
               
                    showToast(ChatMsgActivity.this, "點(diǎn)擊了消息");
                
            }
        });

3.長按消息
一般長按消息磕谅,會選擇一些復(fù)制、刪除雾棺、撤回等功能怜庸。
復(fù)制:在復(fù)制的時(shí)候要先判斷消息類型,如果不是TEXT類型是無法復(fù)制的垢村。
刪除:刪除需要提交消息id到服務(wù)端,并且移除本地視圖嚎卫,更新UI嘉栓。兩行代碼就可以完成操作。

conversation.deleteMessage(new Integer(message.getMsgId()));
                                //移除視圖
                                mAdapter.deleteById(message.getMsgId());

撤回:跟刪除類似拓诸,不過刪除只是本地看不到侵佃,撤回需要接收撤回事件,防止消息撤回還能看到奠支,詳細(xì)操作請參考Android-IM即時(shí)通訊關(guān)于消息撤回的處理

 //長按消息
        mAdapter.setMsgLongClickListener(new MsgListAdapter.OnMsgLongClickListener<MyMessage>() {
            @Override
            public void onMessageLongClick(final MyMessage message) {

}

完整代碼還請參考項(xiàng)目

項(xiàng)目地址:https://github.com/wapchief/Android-IM

相關(guān)文章推薦

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市倍谜,隨后出現(xiàn)的幾起案子迈螟,更是在濱河造成了極大的恐慌,老刑警劉巖尔崔,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件答毫,死亡現(xiàn)場離奇詭異,居然都是意外死亡季春,警方通過查閱死者的電腦和手機(jī)洗搂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人耘拇,你說我怎么就攤上這事撵颊。” “怎么了惫叛?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵倡勇,是天一觀的道長。 經(jīng)常有香客問我挣棕,道長译隘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任洛心,我火速辦了婚禮固耘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘词身。我一直安慰自己厅目,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布法严。 她就那樣靜靜地躺著损敷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪深啤。 梳的紋絲不亂的頭發(fā)上拗馒,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機(jī)與錄音溯街,去河邊找鬼诱桂。 笑死,一個(gè)胖子當(dāng)著我的面吹牛呈昔,可吹牛的內(nèi)容都是我干的挥等。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼堤尾,長吁一口氣:“原來是場噩夢啊……” “哼肝劲!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起郭宝,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤辞槐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后剩蟀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體催蝗,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年育特,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了丙号。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片先朦。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖犬缨,靈堂內(nèi)的尸體忽然破棺而出喳魏,到底是詐尸還是另有隱情,我是刑警寧澤怀薛,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布刺彩,位于F島的核電站,受9級特大地震影響枝恋,放射性物質(zhì)發(fā)生泄漏创倔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一焚碌、第九天 我趴在偏房一處隱蔽的房頂上張望畦攘。 院中可真熱鬧,春花似錦十电、人聲如沸知押。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽台盯。三九已至,卻和暖如春畏线,著一層夾襖步出監(jiān)牢的瞬間静盅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工寝殴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留温亲,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓杯矩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親袖外。 傳聞我的和親對象是個(gè)殘疾皇子史隆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容