当前位置:   article > 正文

Android 极光IM-基础篇_极光im 安卓sdk

极光im 安卓sdk

本篇为基础篇,这里我就来给大家演示一下如何 完成 自定义聊天界面和相关 SDK对接

还有高级篇,为一个功能完整的项目,可供看官选择

 

首先,我要说极光IM好坑,界面需要自己画,自己去对接API。虽然他给了一个demo,但是那个demo太大,而且不好移植到其他项目里。

这是效果图,画的一般大家见谅,毕竟是我亲手设计

1.配置环境

这一步不是本文重点,我这里只给个链接,大家按照官方文档做即可

https://docs.jiguang.cn/jmessage/client/jmessage_android_guide/

 

2.注册和登录用户

因为想要聊天需要两个用户才行,随便画个界面,两个EditText和两个Button就搞定

先注册

  1. JMessageClient.register(et_account.text.toString(),et_pw.text.toString(),object :BasicCallback(){
  2. override fun gotResult(p0: Int, p1: String?) {
  3. Toast.makeText(this@LoginRegisterActivity,p0.toString()+" "+p1,Toast.LENGTH_SHORT).show()
  4. }
  5. })

然后登录

  1. JMessageClient.login(et_account.text.toString(),et_pw.text.toString(),object :BasicCallback(){
  2. override fun gotResult(p0: Int, p1: String?) {
  3. Toast.makeText(this@LoginRegisterActivity,p0.toString()+" "+p1,Toast.LENGTH_SHORT).show()
  4. var myIntent= Intent(this@LoginRegisterActivity,MainActivity::class.java)
  5. startActivity(myIntent)
  6. }
  7. })

 

3.聊天界面绘制

总体参考QQ,不过我做的只能输入文字,一个标题在上,一个输入框和发送按钮在下,聊天记录列表在中间

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. xmlns:app="http://schemas.android.com/apk/res-auto"
  6. android:layout_width="match_parent"
  7. android:layout_height="match_parent"
  8. tools:context=".ChatActivity">
  9. <RelativeLayout
  10. android:id="@+id/rl_title"
  11. android:layout_width="match_parent"
  12. android:layout_height="45dp"
  13. android:background="#2196F3">
  14. <TextView
  15. android:id="@+id/tv_target_account"
  16. android:text="目标用户"
  17. android:textSize="20dp"
  18. android:textColor="#ffffff"
  19. android:layout_centerInParent="true"
  20. android:layout_width="wrap_content"
  21. android:layout_height="wrap_content"/>
  22. </RelativeLayout>
  23. <RelativeLayout
  24. android:id="@+id/rl_send"
  25. android:background="#ffffff"
  26. android:layout_width="match_parent"
  27. android:layout_height="wrap_content"
  28. android:layout_alignParentBottom="true">
  29. <Button
  30. android:layout_alignParentRight="true"
  31. android:id="@+id/btn_send"
  32. android:text="发送"
  33. android:layout_width="wrap_content"
  34. android:layout_height="wrap_content"/>
  35. <EditText
  36. android:layout_toLeftOf="@+id/btn_send"
  37. android:id="@+id/et_send"
  38. android:layout_width="match_parent"
  39. android:layout_height="wrap_content"/>
  40. </RelativeLayout>
  41. <android.support.v7.widget.RecyclerView
  42. android:id="@+id/recyc"
  43. android:layout_width="match_parent"
  44. android:layout_height="match_parent"
  45. android:layout_above="@+id/rl_send"
  46. android:layout_below="@+id/rl_title"></android.support.v7.widget.RecyclerView>
  47. </RelativeLayout>

 

4.对接API(重点)

 

(1)创建和获取会话

想与另一个人聊天,必须创建会话,如果会话能够获取得到,就不用创建了

  1. conversation=JMessageClient.getSingleConversation(account_target)
  2. if(conversation==null){
  3. conversation=Conversation.createSingleConversation(account_target)
  4. }

(2)进入和退出会话

在界面可以交互时,我们要进入会话,这样我们才能接受消息,当界面用户不能交互时,退出会话,这个时机大家依据需求来判断即可

  1. override fun onResume() {
  2. super.onResume()
  3. JMessageClient.enterSingleConversation(account_target)
  4. }
  5. override fun onPause() {
  6. super.onPause()
  7. JMessageClient.exitConversation()
  8. }

(3)完成消息的接受

首先在activity里onCreate,首先注册消息接受服务

        JMessageClient.registerEventReceiver(this)

然后在onDestroy里注销,防止内存泄漏

        JMessageClient.unRegisterEventReceiver(this)

然后完成消息接受函数,这里使用kotlin写的,若大家看不明白,可以看这个链接参考

https://docs.jiguang.cn/jmessage/client/android_sdk/event/

其实这个函数只会在接受对方发给你的消息,而自己发送消息成功,这个函数不会触发,所以我这里判断是否是对方发送的有点多余,而且这个函数需要我们进入 会话 才起效 

  1. public fun onEvent(event: MessageEvent) {
  2. runOnUiThread(
  3. object :Runnable{
  4. override fun run() {
  5. if(event.message.direct==MessageDirect.send){
  6. data.add(ChatItem(ChatItem.SEND, (event.message.getContent() as TextContent).text))
  7. }else{
  8. data.add(ChatItem(ChatItem.RECEIVE,(event.message.getContent() as TextContent).text))
  9. }
  10. adapter?.notifyDataSetChanged()
  11. recyc.scrollToPosition(data.size-1)
  12. }
  13. }
  14. )
  15. }

 

(4)发送消息

我们需要对接消息发送完成回调的接口,为了刷新界面,

  1. var content=et_send.text.toString()
  2. var textContent=TextContent(content)
  3. var m=conversation?.createSendMessage(textContent)
  4. m?.setOnSendCompleteCallback(object :BasicCallback(){
  5. override fun gotResult(p0: Int, p1: String?) {
  6. data.add(ChatItem(ChatItem.SEND, content))
  7. adapter?.notifyDataSetChanged()
  8. recyc.scrollToPosition(data.size-1)
  9. }
  10. })
  11. JMessageClient.sendMessage(m)
  12. et_send.setText("")

 

5.源码

说再多,不如给源码,大家记得在github给个赞,再见了

https://github.com/979451341/JiGuangIMTest

 

6.关于语音通话(2019.9.2)

语音通话和视频通话需要开通试用,有10000分钟够用,但是对于api却有许多坑

他的demo简单至极,参考性极差

我直接先说暗坑, 一个通话真正结束前,你再想进行另一个通话时一定会没反应的

在 onCallMemberOffline 函数里必须执行  挂断命令,不管是接收方,还是拨打方

  1. override fun onCallMemberOffline(
  2. leavedUserInfo: UserInfo?,
  3. reason: JMRtcClient.DisconnectReason?
  4. ) {
  5. super.onCallMemberOffline(leavedUserInfo, reason)
  6. runOnUiThread {
  7. L.t("对话挂断语音通话")
  8. JMRtcClient.getInstance().hangup(object : BasicCallback() {
  9. override fun gotResult(responseCode: Int, responseMessage: String) {
  10. finish()
  11. }
  12. })
  13. }
  14. }

第二个坑是全局监听 别人拨打语音电话并调起界面,这个一定要放在  Application里,这个监听只通过设置一个接口实例完成的

JMRtcClient.getInstance().initEngine(jmRtcListener)

而这个接口设置后,就会覆盖之前设置的,你要知道在语音通话界面,我们还会调用以上的命令一次,所以把application里设置的接口给覆盖了,所以在语音通话界面 的onDestory里要调用application重新执行以上的代码一次,否则你只能通话一次,下次就监听不到了

 

 

7.闲谈

其实我在做公司项目时,语音、系统表情、文件、还有红包(自定义消息,自己存值)、语音通话、地点、名片都做好了,但是把代码分割出来,太费时间了,所以上面的demo也只有一个 文字消息。官方demo一定要参考,但是不能全照着做,因为依赖太老了,版本适配也有问题,大家如果遇到麻烦可以,在评论区问问题。

如果觉得不够,太基础简单了,可以参考高级篇

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/582237
推荐阅读
相关标签
  

闽ICP备14008679号