Android 使用easeui 3.0 集成環信即時通信 我踩過的坑

0、關於註冊帳號就不用說了。

一、建立應用、獲取appkey

0、建立應用java

建立應用

一、填寫信息android

填寫信息

二、獲取appkey數據庫

獲取appkey

二、集成

0、首先新建一個projectmarkdown

一、這裏主要介紹使用easeui來集成環信的即時通信功能,需要下載sdkapp

下載android sdk
easeui的位置

二、把easeui當作依賴導入到project其中。而後創建依賴關係curl

創建依賴關係

3在導入以後可能會出現的問題:
3.0ide

<uses-permission android:name="android.permission.ACCESS_MOCK_LACATTON>

這個權限報錯,在諮詢官方技術以後,獲得的答覆是,可以去掉該權限。詳細的權限信息可以參考demo中的權限。佈局


3.1 因爲easeui裏邊包括v4包,致使V4包衝突,但是在刪除掉項目的V4包以後。仍是報錯。緣由是在project裏邊包括v7包,而v7包又包括v4。因此仍是會報錯。
報錯信息例如如下:post

這裏寫圖片描寫敘述

開始覺得是jdk的緣由。但是在查閱資料以後發現是包衝突的問題,解決方式:
解決:把項目中的v7刪掉,而後把easeui裏邊的V4刪掉,而後在easeui裏邊加入v7包。這樣就不會報錯了。ui

四、環境信息配置:

4.0:在AndroidManifest.xml文件里加入一下權限:

需要的權限

4.1:配置環信key

配置環信key

4.2初始化:這裏寫最簡單的,其它的像好友驗證等功能參考demo

這裏寫圖片描寫敘述

4.3 .0在easeui使用中,涉及到百度地圖,在此需要自行到百度地圖官網建立應用,申請appkey:
詳細配置例如如下(在此處僅僅需要填寫appkey,不需要初始化):

這裏寫圖片描寫敘述

4.3.1:在發送圖片的時候可能會有看大圖、查看地圖的功能,在easeui中提提供了這些activity。咱們僅僅需要在本身的清單文件裏註冊一下。詳細代碼例如如下:

這裏寫圖片描寫敘述

三、使用

在此處略過文檔上有的登陸註冊功能。

在此介紹部分可能會有坑的地方。


注意:0、註冊功能通常需要server來實現;一、在使用初始化的時候。easeui默認有本身主動登陸功能,使用時需要注意,假設需要關閉此功能,在初始化部分加入例如如下代碼:
//去取消本身主動登陸
options.setAutoLogin(false);

0、easeui 適配android6.0:
在下載好的demo中,找到runtimepermissions目錄,(詳細路徑看圖)。而後在MainActivity中加入一下代碼(看圖)

這裏寫圖片描寫敘述

在MainActivity中加入例如如下代碼

一、在消息監聽中如需需要查看有沒有走到這裏。不要使用Toast來驗證,因爲在監聽中屬於子線程。
二、使用到的頭像、用戶名這些信息。建議把頭像的url和用戶暱稱存在本地數據庫,這樣不用每次都去後臺取(取後臺取的話,可能會出現一閃一閃的狀況),假設用戶信息發生變化了。可以讓後臺給發一個透傳消息,而後去更新數據庫裏邊的數據。
三、關於消息的置頂和取消置頂,可以經過擴展消息來實現,在環信裏邊,每一個消息可以附加擴展消息,咱們可以在擴展消息裏邊加一個屬性,而後在設置適配器的時候依據這個屬性去實現置頂,在發送消息的時候要給每一個置頂的會話中的消息,都附加上該擴展屬性。
四、關於羣聊天的禁言。可以在進入去聊天的時候先推斷本身的禁言狀態,而後當被禁言和被取消禁言的時候,讓後臺給發一個透傳消息,來解決問題。


五、關於設置圓形頭像,需要在佈局文件裏使用本身定義view去替換easeui中的ImageView;

六、本身定義消息列表,最後一條消息假設是表情,就加上這一句。就可以把最後表情表現出來了。

holder.messages_text.setText( EaseSmileUtils.getSmiledText(context, EaseCommonUtils
.getMessageDigest(listEMConversation.get(position).getLastMessage(), context)),BufferType.SPANNA
BLE);

位置:

if (listEMConversation.get(position).getLastMessage().getType() == EMMessage.Type.LOCATION) {
            holder.messages_text.setText("[位置]");
}

七、本身給本身發一條消息

// 刪除和某個user會話,假設需要保留聊天記錄。傳false\
EMClient.getInstance().chatManager()
.deleteConversation(username, true);\
// 接收到好友請求 而後建立一個會話 加入一個擴展消息
EMMessage emMessage = EMMessage
.createReceiveMessage(EMMessage.Type.CMD);
emMessage.setFrom(username);//發送人
emMessage.addBody(new EMTextMessageBody("我請求加入您爲好友"));//建立消息
emMessage.setUnread(true);//是否已讀
emMessage.setChatType(EMMessage.ChatType.Chat);//聊天類型
emMessage.setMsgTime(System.currentTimeMillis());//消息時間
emMessage.setAttribute("messagetype", "FriendInvitation");//擴展消息
emMessage.setTo(PublicStaticData.prefreences.getString("ueserid", ""));//發送給
EMClient.getInstance().chatManager().saveMessage(emMessage);本身給本身發一條消息

八、本身定義消息條目,假設需要實現像QQ聊天頁面的分享,就需要本身去定義一個這種條目的佈局。額。不正確,因該是兩個。一個接收的一個發送的。而後easeui給提供了一個接口(EaseCustomChatRowProvider),我們去實現這個接口接可以了。


關鍵代碼例如如下:
8.0首先去寫本身定義的條目數量(在需要的數量上*2。一個接收的,一個發送的)

定義接收和發送的消息類型

8.1去實現三個方法:

getCustomChatRowTypeCount() getCustomChatRowType(EMMessage message) getCustomChatRow(EMMessage message, intposition,BaseAdapter adapter)

getCustomChatRowType

在此方法中可以利用消息的擴展消息來實現,咱們先推斷擴展消息的內容。而後去分別載入不一樣的佈局。

getCustomChatRow

去建立不一樣的條目

本身定義條目代碼例如如下(你們可以參照easeui自帶的條目樣式去實現,此處提供EaseChatRowPic.java代碼)

importandroid.content.Context; importandroid.text.Spannable; importandroid.view.View; importandroid.widget.BaseAdapter; importandroid.widget.ImageView; importandroid.widget.TextView; importandroid.widget.TextView.BufferType; importcom.hyphenate.chat.EMClient; importcom.hyphenate.chat.EMMessage; importcom.hyphenate.chat.EMMessage.ChatType; importcom.hyphenate.easeui.R; importcom.hyphenate.easeui.publicData.StaticData; importcom.hyphenate.easeui.utils.EaseSmileUtils; importcom.hyphenate.exceptions.HyphenateException; importcom.lidroid.xutils.BitmapUtils; public classEaseChatRowOnePicextendsEaseChatRow { privateTextViewtitle; privateImageViewimg1; privateTextViewcontent; publicEaseChatRowOnePic(Contextcontext,EMMessage message, intposition,BaseAdapter adapter) { super(context,message,position,adapter); } @Override protected voidonInflatView() { inflater.inflate(message.direct() == EMMessage.Direct.RECEIVE?

R.layout.myease_row_received_picture2: R.layout.myease_row_sent_picture2, this); } @Override protected voidonFindViewById() { title= (TextView) findViewById(R.id.myease2_received_title); content= (TextView) findViewById(R.id.myease2_received_content); img1= (ImageView) findViewById(R.id.myease2_received_image132); } @Override public voidonSetUpView() { // 設置內容 String titleString =""; String contentString =""; String picurlString =""; //設置標題 try{ titleString =message.getStringAttribute("EXT_TITLE"); contentString =message.getStringAttribute("EXT_DETAIL"); picurlString =message.getStringAttribute("EXT_IMG1"); }catch(HyphenateException e) { e.printStackTrace(); } Spannable span; span = EaseSmileUtils.getSmiledText(context,titleString); title.setText(span,BufferType.SPANNABLE); //設置內容 span = EaseSmileUtils.getSmiledText(context,contentString); content.setText(span,BufferType.SPANNABLE); if(!picurlString.equals("")) { //設置圖片 BitmapUtils bitmapUtils =newBitmapUtils(getContext(),StaticData.picpath); bitmapUtils.display(img1,picurlString); } handleTextMessage(); } protected voidhandleTextMessage() { if(message.direct() == EMMessage.Direct.SEND) { setMessageSendCallback(); switch(message.status()) { caseCREATE: progressBar.setVisibility(View.GONE); statusView.setVisibility(View.VISIBLE); // 發送消息 break; caseSUCCESS:// 發送成功 progressBar.setVisibility(View.GONE); statusView.setVisibility(View.GONE); break; caseFAIL:// 發送失敗 progressBar.setVisibility(View.GONE); statusView.setVisibility(View.VISIBLE); break; caseINPROGRESS:// 發送中 progressBar.setVisibility(View.VISIBLE); statusView.setVisibility(View.GONE); break; default: break; } }else{ if(!message.isAcked() &&message.getChatType() == ChatType.Chat) { try{ EMClient.getInstance().chatManager().ackMessageRead(message.getFrom(),message.getMsgId()); }catch(HyphenateException e) { e.printStackTrace(); } } } } @Override protected voidonUpdateView() { adapter.notifyDataSetChanged(); } @Override protected voidonBubbleClick() {} }

使用:在fragment所在的activity中,設置聊天頁面的屬性,代碼例如如下:
這裏寫圖片描寫敘述

使用本身定義的條目。假設小夥伴們沒有看明確,就去看一下這個詳細的介紹。

easeui本身定義消息佈局

九、聊天界面的啓動模式 使用singleTask 假設有界面反覆跳轉。就會出現頁面跳轉。


十、在集成easeui以後。發現一個問題。可能會出現在有些版本號的手機上一點桌面的圖標,程序崩潰的狀況,解決方式例如如下:
在libs下建立一個armeabi-v7a,將armeabi中的so在v7a複製一份。兼容不少其它版本號的手機。

解決點擊圖標崩潰問題

十一、 發現在聊天頁面的語音播放功能不能使用,沒有點擊播放的效果,找了很久的緣由。

發現在進入聊天的fragment以前設置了點擊頭像的屬性。

。。真是個坑,花了半天時間。。

messageList.setItemClickListener(new EaseChatMessageList.MessageListItemClickListener() {
                    @Override
                    public void onUserAvatarClick(String username) {
                        System.err.println("點擊頭像");
                        // 頭像點擊事件
                        PublicStaticData.thisFriendsId = Long
                                .parseLong(username);
                        System.err.println("username:"+Long.parseLong(username));
                        Intent intent = new Intent(XingActivity_01.this,
                                ShejiaoFriendDetailsActivity.class);
                        startActivity(intent);
                    }
                    @Override
                    public void onResendClick(final EMMessage message) {
                        // 重發消息button點擊事件
                    }
                    @Override
                    public void onBubbleLongClick(EMMessage message) {
                        // 氣泡框長按事件
                    }
                    @Override
                    public boolean onBubbleClick(EMMessage message) {
                        // 氣泡框點擊事件,EaseUI有默認實現這個事件。假設需要覆蓋,return值要返回true
                        //注意這裏。必定要返回false,不然點擊事件就會覆蓋了
                        return false;
                    }
                    @Override
                    public void onUserAvatarLongClick(String username) {
                        // TODO Auto-generated method stub
                    }
                });

消息的點擊事件

好了,easeui部分就分享到這裏。

但願能幫你解決一部分坑。

謝謝。

文/李清Lin(簡書做者)
原文連接:http://www.jianshu.com/p/fa36152f1d57# 著做權歸做者所有,轉載請聯繫做者得到受權,並標註「簡書做者」。

相關文章
相關標籤/搜索