本篇爲基礎篇,這裏我就來給大家演示一下如何 完成 自定義聊天界面和相關 SDK對接
還有高級篇,爲一個功能完整的項目,可供看官選擇
首先,我要說極光IM好坑,界面需要自己畫,自己去對接API。雖然他給了一個demo,但是那個demo太大,而且不好移植到其他項目裏。
這是效果圖,畫的一般大家見諒,畢竟是我親手設計
1.配置環境
這一步不是本文重點,我這裏只給個鏈接,大家按照官方文檔做即可
https://docs.jiguang.cn/jmessage/client/jmessage_android_guide/
2.註冊和登錄用戶
因爲想要聊天需要兩個用戶才行,隨便畫個界面,兩個EditText和兩個Button就搞定
先註冊
JMessageClient.register(et_account.text.toString(),et_pw.text.toString(),object :BasicCallback(){
override fun gotResult(p0: Int, p1: String?) {
Toast.makeText(this@LoginRegisterActivity,p0.toString()+" "+p1,Toast.LENGTH_SHORT).show()
}
})
然後登錄
JMessageClient.login(et_account.text.toString(),et_pw.text.toString(),object :BasicCallback(){
override fun gotResult(p0: Int, p1: String?) {
Toast.makeText(this@LoginRegisterActivity,p0.toString()+" "+p1,Toast.LENGTH_SHORT).show()
var myIntent= Intent(this@LoginRegisterActivity,MainActivity::class.java)
startActivity(myIntent)
}
})
3.聊天界面繪製
總體參考QQ,不過我做的只能輸入文字,一個標題在上,一個輸入框和發送按鈕在下,聊天記錄列表在中間
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ChatActivity">
<RelativeLayout
android:id="@+id/rl_title"
android:layout_width="match_parent"
android:layout_height="45dp"
android:background="#2196F3">
<TextView
android:id="@+id/tv_target_account"
android:text="目標用戶"
android:textSize="20dp"
android:textColor="#ffffff"
android:layout_centerInParent="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</RelativeLayout>
<RelativeLayout
android:id="@+id/rl_send"
android:background="#ffffff"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true">
<Button
android:layout_alignParentRight="true"
android:id="@+id/btn_send"
android:text="發送"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<EditText
android:layout_toLeftOf="@+id/btn_send"
android:id="@+id/et_send"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</RelativeLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/recyc"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/rl_send"
android:layout_below="@+id/rl_title"></android.support.v7.widget.RecyclerView>
</RelativeLayout>
4.對接API(重點)
(1)創建和獲取會話
想與另一個人聊天,必須創建會話,如果會話能夠獲取得到,就不用創建了
conversation=JMessageClient.getSingleConversation(account_target)
if(conversation==null){
conversation=Conversation.createSingleConversation(account_target)
}
(2)進入和退出會話
在界面可以交互時,我們要進入會話,這樣我們才能接受消息,當界面用戶不能交互時,退出會話,這個時機大家依據需求來判斷即可
override fun onResume() {
super.onResume()
JMessageClient.enterSingleConversation(account_target)
}
override fun onPause() {
super.onPause()
JMessageClient.exitConversation()
}
(3)完成消息的接受
首先在activity裏onCreate,首先註冊消息接受服務
JMessageClient.registerEventReceiver(this)
然後在onDestroy裏註銷,防止內存泄漏
JMessageClient.unRegisterEventReceiver(this)
然後完成消息接受函數,這裏使用kotlin寫的,若大家看不明白,可以看這個鏈接參考
https://docs.jiguang.cn/jmessage/client/android_sdk/event/
其實這個函數只會在接受對方發給你的消息,而自己發送消息成功,這個函數不會觸發,所以我這裏判斷是否是對方發送的有點多餘,而且這個函數需要我們進入 會話 才起效
public fun onEvent(event: MessageEvent) {
runOnUiThread(
object :Runnable{
override fun run() {
if(event.message.direct==MessageDirect.send){
data.add(ChatItem(ChatItem.SEND, (event.message.getContent() as TextContent).text))
}else{
data.add(ChatItem(ChatItem.RECEIVE,(event.message.getContent() as TextContent).text))
}
adapter?.notifyDataSetChanged()
recyc.scrollToPosition(data.size-1)
}
}
)
}
(4)發送消息
我們需要對接消息發送完成回調的接口,爲了刷新界面,
var content=et_send.text.toString()
var textContent=TextContent(content)
var m=conversation?.createSendMessage(textContent)
m?.setOnSendCompleteCallback(object :BasicCallback(){
override fun gotResult(p0: Int, p1: String?) {
data.add(ChatItem(ChatItem.SEND, content))
adapter?.notifyDataSetChanged()
recyc.scrollToPosition(data.size-1)
}
})
JMessageClient.sendMessage(m)
et_send.setText("")
5.源碼
說再多,不如給源碼,大家記得在github給個贊,再見了
https://github.com/979451341/JiGuangIMTest
6.關於語音通話(2019.9.2)
語音通話和視頻通話需要開通試用,有10000分鐘夠用,但是對於api卻有許多坑
他的demo簡單至極,參考性極差
我直接先說暗坑, 一個通話真正結束前,你再想進行另一個通話時一定會沒反應的,
在 onCallMemberOffline 函數裏必須執行 掛斷命令,不管是接收方,還是撥打方
override fun onCallMemberOffline(
leavedUserInfo: UserInfo?,
reason: JMRtcClient.DisconnectReason?
) {
super.onCallMemberOffline(leavedUserInfo, reason)
runOnUiThread {
L.t("對話掛斷語音通話")
JMRtcClient.getInstance().hangup(object : BasicCallback() {
override fun gotResult(responseCode: Int, responseMessage: String) {
finish()
}
})
}
}
第二個坑是全局監聽 別人撥打語音電話並調起界面,這個一定要放在 Application裏,這個監聽只通過設置一個接口實例完成的
JMRtcClient.getInstance().initEngine(jmRtcListener)
而這個接口設置後,就會覆蓋之前設置的,你要知道在語音通話界面,我們還會調用以上的命令一次,所以把application裏設置的接口給覆蓋了,所以在語音通話界面 的onDestory裏要調用application重新執行以上的代碼一次,否則你只能通話一次,下次就監聽不到了
7.閒談
其實我在做公司項目時,語音、系統表情、文件、還有紅包(自定義消息,自己存值)、語音通話、地點、名片都做好了,但是把代碼分割出來,太費時間了,所以上面的demo也只有一個 文字消息。官方demo一定要參考,但是不能全照着做,因爲依賴太老了,版本適配也有問題,大家如果遇到麻煩可以,在評論區問問題。
如果覺得不夠,太基礎簡單了,可以參考高級篇