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"?>
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一定要参考,但是不能全照着做,因为依赖太老了,版本适配也有问题,大家如果遇到麻烦可以,在评论区问问题。
如果觉得不够,太基础简单了,可以参考高级篇
更多相关文章
- Android(安卓)用户界面---拖放(Drag and Drop)(一)
- 生活中android应用开发有很广阔的天地
- BlockCanary — 轻松找出Android(安卓)App界面卡顿元凶
- 手机端软件界面设计中的几种常用布局
- android 小型音乐播放器(实现播放、下一首、上一首、自动播放、随
- 关于android滑屏菜单和tab菜单实现
- 基于Android小巫新闻客户端开发---显示新闻详细内容UI设计
- Android社交系统----代码结构
- Android--------WebView+H5开发仿美团 预加载,加载失败和重新加载