Android Easeui 3.0 即時(shí)通訊的問題匯總
0、關(guān)于注冊(cè)賬號(hào)就不用說了。
1、創(chuàng)建應(yīng)用、獲取appkey
0、創(chuàng)建應(yīng)用
1、填寫信息
2、獲取appkey
2、集成
0、首先新建一個(gè)工程
1、這里主要介紹使用easeui來集成環(huán)信的即時(shí)通訊功能,需要下載sdk
2、把easeui當(dāng)做依賴導(dǎo)入到工程當(dāng)中,然后建立依賴關(guān)系
3在導(dǎo)入之后可能會(huì)出現(xiàn)的問題:
3.0
<uses-permission android:name="android.permission.ACCESS_MOCK_LACATTON>
這個(gè)權(quán)限報(bào)錯(cuò),在咨詢官方技術(shù)之后,得到的答復(fù)是,可以去掉該權(quán)限。具體的權(quán)限信息可以參考demo中的權(quán)限。
3.1 因?yàn)閑aseui里邊包含v4包,導(dǎo)致V4包沖突,但是在刪除掉項(xiàng)目的V4包之后,還是報(bào)錯(cuò)。原因是在工程里邊包含v7包,而v7包又包含v4,所以還是會(huì)報(bào)錯(cuò)。
報(bào)錯(cuò)信息如下:
開始以為是jdk的原因,但是在查閱資料之后發(fā)現(xiàn)是包沖突的問題,解決方案:
解決:把項(xiàng)目中的v7刪掉,然后把easeui里邊的V4刪掉,然后在easeui里邊添加v7包。這樣就不會(huì)報(bào)錯(cuò)了。
4、環(huán)境信息配置:
4.0:在AndroidManifest.xml文件中加入一下權(quán)限:
4.1:配置環(huán)信key
4.2初始化:這里寫最簡(jiǎn)單的,其他的像好友驗(yàn)證等功能參考demo
4.3 .0在easeui使用中,涉及到百度地圖,在此需要自行到百度地圖官網(wǎng)創(chuàng)建應(yīng)用,申請(qǐng)appkey:
具體配置如下(在此處只需要填寫appkey,不需要初始化):
4.3.1:在發(fā)送圖片的時(shí)候可能會(huì)有看大圖、查看地圖的功能,在easeui中提提供了這些activity,我們只需要在自己的清單文件中注冊(cè)一下。具體代碼如下:
3、使用
在此處略過文檔上有的登錄注冊(cè)功能。在此介紹部分可能會(huì)有坑的地方。
注意:0、注冊(cè)功能一般需要服務(wù)器來實(shí)現(xiàn);1、在使用初始化的時(shí)候,easeui默認(rèn)有自動(dòng)登錄功能,使用時(shí)需要注意,如果需要關(guān)閉此功能,在初始化部分添加如下代碼:
//去取消自動(dòng)登錄 options.setAutoLogin(false);
0、easeui 適配android6.0:
在下載好的demo中,找到runtimepermissions文件夾,(具體路徑看圖),然后在MainActivity中加入一下代碼(看圖)
在MainActivity中添加如下代碼
1、在消息監(jiān)聽中如需需要查看有沒有走到這里,不要使用Toast來驗(yàn)證,因?yàn)樵诒O(jiān)聽中屬于子線程。
2、使用到的頭像、用戶名這些信息。建議把頭像的url和用戶昵稱存在本地?cái)?shù)據(jù)庫,這樣不用每次都去后臺(tái)取(取后臺(tái)取的話,可能會(huì)出現(xiàn)一閃一閃的情況),如果用戶信息發(fā)生變化了,可以讓后臺(tái)給發(fā)一個(gè)透?jìng)飨?,然后去更新?shù)據(jù)庫里邊的數(shù)據(jù)。
3、關(guān)于消息的置頂和取消置頂,可以通過擴(kuò)展消息來實(shí)現(xiàn),在環(huán)信里邊,每個(gè)消息可以附加擴(kuò)展消息,我們可以在擴(kuò)展消息里邊加一個(gè)屬性,然后在設(shè)置適配器的時(shí)候根據(jù)這個(gè)屬性去實(shí)現(xiàn)置頂,在發(fā)送消息的時(shí)候要給每一個(gè)置頂?shù)臅?huì)話中的消息,都附加上該擴(kuò)展屬性。
4、關(guān)于群聊天的禁言,可以在進(jìn)入去聊天的時(shí)候先判斷自己的禁言狀態(tài),然后當(dāng)被禁言和被取消禁言的時(shí)候,讓后臺(tái)給發(fā)一個(gè)透?jìng)飨?,來解決這個(gè)問題。
5、關(guān)于設(shè)置圓形頭像,需要在布局文件中使用自定義view去替換easeui中的ImageView;
6、自定義消息列表,最后一條消息如果是表情,就加上這一句,就可以把最后表情表現(xiàn)出來了。
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("[位置]"); }
7、自己給自己發(fā)一條消息
// 刪除和某個(gè)user會(huì)話,如果需要保留聊天記錄,傳false\ EMClient.getInstance().chatManager() .deleteConversation(username, true);\ // 接收到好友請(qǐng)求 然后創(chuàng)建一個(gè)會(huì)話 添加一個(gè)擴(kuò)展消息 EMMessage emMessage = EMMessage .createReceiveMessage(EMMessage.Type.CMD); emMessage.setFrom(username);//發(fā)送人 emMessage.addBody(new EMTextMessageBody("我請(qǐng)求添加您為好友"));//創(chuàng)建消息 emMessage.setUnread(true);//是否已讀 emMessage.setChatType(EMMessage.ChatType.Chat);//聊天類型 emMessage.setMsgTime(System.currentTimeMillis());//消息時(shí)間 emMessage.setAttribute("messagetype", "FriendInvitation");//擴(kuò)展消息 emMessage.setTo(PublicStaticData.prefreences.getString("ueserid", ""));//發(fā)送給 EMClient.getInstance().chatManager().saveMessage(emMessage);自己給自己發(fā)一條消息
8、自定義消息條目,如果需要實(shí)現(xiàn)像QQ聊天頁面的分享,就需要自己去定義一個(gè)這樣的條目的布局,額,不對(duì),因該是兩個(gè)。一個(gè)接收的一個(gè)發(fā)送的。
然后easeui給提供了一個(gè)接口(EaseCustomChatRowProvider),咱們?nèi)?shí)現(xiàn)這個(gè)接口接可以了。
關(guān)鍵代碼如下:
8.0首先去寫自定義的條目數(shù)量(在需要的數(shù)量上*2,一個(gè)接收的,一個(gè)發(fā)送的)
定義接收和發(fā)送的消息類型
8.1去實(shí)現(xiàn)三個(gè)方法:
getCustomChatRowTypeCount() getCustomChatRowType(EMMessage message) getCustomChatRow(EMMessage message, intposition,BaseAdapter adapter)
getCustomChatRowType
在此方法中可以利用消息的擴(kuò)展消息來實(shí)現(xiàn),我們先判斷擴(kuò)展消息的內(nèi)容,然后去分別加載不同的布局。
去創(chuàng)建不同的條目
自定義條目代碼如下(大家可以參照easeui自帶的條目樣式去實(shí)現(xiàn),此處提供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() { // 設(shè)置內(nèi)容 String titleString =""; String contentString =""; String picurlString =""; //設(shè)置標(biāo)題 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); //設(shè)置內(nèi)容 span = EaseSmileUtils.getSmiledText(context,contentString); content.setText(span,BufferType.SPANNABLE); if(!picurlString.equals("")) { //設(shè)置圖片 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); // 發(fā)送消息 break; caseSUCCESS:// 發(fā)送成功 progressBar.setVisibility(View.GONE); statusView.setVisibility(View.GONE); break; caseFAIL:// 發(fā)送失敗 progressBar.setVisibility(View.GONE); statusView.setVisibility(View.VISIBLE); break; caseINPROGRESS:// 發(fā)送中 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中,設(shè)置聊天頁面的屬性,代碼如下:
使用自定義的條目
9、聊天界面的啟動(dòng)模式 使用singleTask 如果有界面重復(fù)跳轉(zhuǎn),就會(huì)出現(xiàn)頁面跳轉(zhuǎn)。
10、在集成easeui之后,發(fā)現(xiàn)一個(gè)問題??赡軙?huì)出現(xiàn)在有些版本的手機(jī)上一點(diǎn)桌面的圖標(biāo),程序崩潰的情況,解決方案如下:
在libs下創(chuàng)建一個(gè)armeabi-v7a,將armeabi中的so在v7a復(fù)制一份,兼容更多版本的手機(jī)。
11、 發(fā)現(xiàn)在聊天頁面的語音播放功能不能使用,沒有點(diǎn)擊播放的效果,找了好久的原因。發(fā)現(xiàn)在進(jìn)入聊天的fragment之前設(shè)置了點(diǎn)擊頭像的屬性。。。真是個(gè)坑,花了半天時(shí)間。。
messageList.setItemClickListener(new EaseChatMessageList.MessageListItemClickListener() { @Override public void onUserAvatarClick(String username) { System.err.println("點(diǎn)擊頭像"); // 頭像點(diǎn)擊事件 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) { // 重發(fā)消息按鈕點(diǎn)擊事件 } @Override public void onBubbleLongClick(EMMessage message) { // 氣泡框長(zhǎng)按事件 } @Override public boolean onBubbleClick(EMMessage message) { // 氣泡框點(diǎn)擊事件,EaseUI有默認(rèn)實(shí)現(xiàn)這個(gè)事件,如果需要覆蓋,return值要返回true //注意這里,一定要返回false,否則點(diǎn)擊事件就會(huì)覆蓋了 return false; } @Override public void onUserAvatarLongClick(String username) { // TODO Auto-generated method stub } });
消息的點(diǎn)擊事件
好了,easeui部分就分享到這里。如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
mac系統(tǒng)下載、安裝、使用AndroidStudio
本文給大家介紹的是在Mac系統(tǒng)中下載安裝以及使用AndroidStudio的詳細(xì)教程,非常的實(shí)用,有需要的小伙伴可以參考下2017-10-10Android開啟新線程實(shí)現(xiàn)電子廣告牌項(xiàng)目
這篇文章主要為大家詳細(xì)介紹了Android開啟新線程實(shí)現(xiàn)電子廣告牌項(xiàng)目,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12Android編程之內(nèi)存溢出解決方案(OOM)實(shí)例總結(jié)
這篇文章主要介紹了Android編程之內(nèi)存溢出解決方案(OOM),結(jié)合實(shí)例實(shí)例總結(jié)分析了Android編程過程中常見的內(nèi)存溢出情況與對(duì)應(yīng)的解決方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11Android自定義控件實(shí)現(xiàn)簡(jiǎn)單滑動(dòng)開關(guān)效果
這篇文章主要為大家詳細(xì)介紹了Android自定義控件實(shí)現(xiàn)簡(jiǎn)單滑動(dòng)開關(guān)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02Android實(shí)現(xiàn)手電筒電源鍵關(guān)閉功能
這篇文章主要介紹了Android實(shí)現(xiàn)手電筒電源鍵關(guān)閉功能,在打開手電筒之后,機(jī)器休眠,客戶要求點(diǎn)擊電源鍵,手電筒需要關(guān)閉,下面小編給大家分享實(shí)現(xiàn)代碼,需要的朋友可以參考下2017-11-11詳解Android開發(fā)之MP4文件轉(zhuǎn)GIF文件
這篇文章介紹的是將錄下來的視頻選取一小段轉(zhuǎn)為 GIF 文件,不僅時(shí)間段可以手動(dòng)選取,而且還需要支持截取視頻的局部區(qū)域轉(zhuǎn)為 GIF,網(wǎng)上調(diào)研了一下技術(shù)方案,覺得還是有必要把實(shí)現(xiàn)過程拿出來分享下,有需要的可以直接拿過去用。下面來一起看看。2016-08-08學(xué)習(xí)Android Handler消息傳遞機(jī)制
這篇文章主要為大家詳細(xì)介紹了Android Handler消息傳遞機(jī)制,感興趣的小伙伴們可以參考一下2016-08-08Android使用WebSocket實(shí)現(xiàn)多人游戲
WebSocket 是 HTML5 一種新的協(xié)議。實(shí)現(xiàn)了瀏覽器與服務(wù)器全雙工通信,下面通過本文給大家分享Android使用WebSocket實(shí)現(xiàn)多人游戲,需要的朋友參考下吧2017-11-11