Android 極光IM-基礎篇

本篇爲基礎篇,這裏我就來給大家演示一下如何 完成 自定義聊天界面和相關 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一定要參考,但是不能全照着做,因爲依賴太老了,版本適配也有問題,大家如果遇到麻煩可以,在評論區問問題。

如果覺得不夠,太基礎簡單了,可以參考高級篇

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章