Android Easeui 3.0 即時(shí)通訊的問(wèn)題匯總
0、關(guān)于注冊(cè)賬號(hào)就不用說(shuō)了。
1、創(chuàng)建應(yīng)用、獲取appkey
0、創(chuàng)建應(yīng)用

1、填寫(xiě)信息

2、獲取appkey

2、集成
0、首先新建一個(gè)工程
1、這里主要介紹使用easeui來(lái)集成環(huán)信的即時(shí)通訊功能,需要下載sdk

2、把easeui當(dāng)做依賴(lài)導(dǎo)入到工程當(dāng)中,然后建立依賴(lài)關(guān)系

3在導(dǎo)入之后可能會(huì)出現(xiàn)的問(wèn)題:
3.0
<uses-permission android:name="android.permission.ACCESS_MOCK_LACATTON>
這個(gè)權(quán)限報(bào)錯(cuò),在咨詢(xún)官方技術(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ò)信息如下:

開(kāi)始以為是jdk的原因,但是在查閱資料之后發(fā)現(xiàn)是包沖突的問(wè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初始化:這里寫(xiě)最簡(jiǎn)單的,其他的像好友驗(yàn)證等功能參考demo

4.3 .0在easeui使用中,涉及到百度地圖,在此需要自行到百度地圖官網(wǎng)創(chuàng)建應(yīng)用,申請(qǐng)appkey:
具體配置如下(在此處只需要填寫(xiě)appkey,不需要初始化):

4.3.1:在發(fā)送圖片的時(shí)候可能會(huì)有看大圖、查看地圖的功能,在easeui中提提供了這些activity,我們只需要在自己的清單文件中注冊(cè)一下。具體代碼如下:

3、使用
在此處略過(guò)文檔上有的登錄注冊(cè)功能。在此介紹部分可能會(huì)有坑的地方。
注意:0、注冊(cè)功能一般需要服務(wù)器來(lái)實(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)聽(tīng)中如需需要查看有沒(méi)有走到這里,不要使用Toast來(lái)驗(yàn)證,因?yàn)樵诒O(jiān)聽(tīng)中屬于子線程。
2、使用到的頭像、用戶(hù)名這些信息。建議把頭像的url和用戶(hù)昵稱(chēng)存在本地?cái)?shù)據(jù)庫(kù),這樣不用每次都去后臺(tái)?。ㄈ『笈_(tái)取的話,可能會(huì)出現(xiàn)一閃一閃的情況),如果用戶(hù)信息發(fā)生變化了,可以讓后臺(tái)給發(fā)一個(gè)透?jìng)飨?,然后去更新?shù)據(jù)庫(kù)里邊的數(shù)據(jù)。
3、關(guān)于消息的置頂和取消置頂,可以通過(guò)擴(kuò)展消息來(lái)實(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)飨?,?lái)解決這個(gè)問(wèn)題。
5、關(guān)于設(shè)置圓形頭像,需要在布局文件中使用自定義view去替換easeui中的ImageView;
6、自定義消息列表,最后一條消息如果是表情,就加上這一句,就可以把最后表情表現(xiàn)出來(lái)了。
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);//聊天類(lèi)型
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聊天頁(yè)面的分享,就需要自己去定義一個(gè)這樣的條目的布局,額,不對(duì),因該是兩個(gè)。一個(gè)接收的一個(gè)發(fā)送的。
然后easeui給提供了一個(gè)接口(EaseCustomChatRowProvider),咱們?nèi)?shí)現(xiàn)這個(gè)接口接可以了。
關(guān)鍵代碼如下:
8.0首先去寫(xiě)自定義的條目數(shù)量(在需要的數(shù)量上*2,一個(gè)接收的,一個(gè)發(fā)送的)
定義接收和發(fā)送的消息類(lèi)型
8.1去實(shí)現(xiàn)三個(gè)方法:
getCustomChatRowTypeCount() getCustomChatRowType(EMMessage message) getCustomChatRow(EMMessage message, intposition,BaseAdapter adapter)
getCustomChatRowType
在此方法中可以利用消息的擴(kuò)展消息來(lái)實(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è)置聊天頁(yè)面的屬性,代碼如下:

使用自定義的條目
9、聊天界面的啟動(dòng)模式 使用singleTask 如果有界面重復(fù)跳轉(zhuǎn),就會(huì)出現(xiàn)頁(yè)面跳轉(zhuǎn)。
10、在集成easeui之后,發(fā)現(xiàn)一個(gè)問(wèn)題??赡軙?huì)出現(xiàn)在有些版本的手機(jī)上一點(diǎn)桌面的圖標(biāo),程序崩潰的情況,解決方案如下:
在libs下創(chuàng)建一個(gè)armeabi-v7a,將armeabi中的so在v7a復(fù)制一份,兼容更多版本的手機(jī)。

11、 發(fā)現(xiàn)在聊天頁(yè)面的語(yǔ)音播放功能不能使用,沒(méi)有點(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部分就分享到這里。如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Android 架構(gòu)之?dāng)?shù)據(jù)庫(kù)框架搭建
這篇文章主要給大家介紹的是Android 架構(gòu)之?dāng)?shù)據(jù)庫(kù)框架搭建,在本篇中,將會(huì)讓你一點(diǎn)一滴從無(wú)到有創(chuàng)建一個(gè)不再為數(shù)據(jù)庫(kù)而煩惱的框架。需要的朋友可以參考下面文章的具體內(nèi)容2021-09-09
Android ViewPager實(shí)現(xiàn)選項(xiàng)卡切換
Android編程動(dòng)態(tài)按鈕實(shí)現(xiàn)方法
Android 給應(yīng)用程序的icon添加未讀消息個(gè)數(shù)提示(紅圈內(nèi)數(shù)字)
Android自定義控件RatingBar調(diào)整字體大小
簡(jiǎn)單談?wù)刟ndroid studio 的單元測(cè)試
Android自定義圓形倒計(jì)時(shí)進(jìn)度條

