技术标签: 极光IM Android 各种第三方平台的使用 Android
本篇为基础篇,这里我就来给大家演示一下如何 完成 自定义聊天界面和相关 SDK对接
还有高级篇,为一个功能完整的项目,可供看官选择
首先,我要说极光IM好坑,界面需要自己画,自己去对接API。虽然他给了一个demo,但是那个demo太大,而且不好移植到其他项目里。
这是效果图,画的一般大家见谅,毕竟是我亲手设计
这一步不是本文重点,我这里只给个链接,大家按照官方文档做即可
https://docs.jiguang.cn/jmessage/client/jmessage_android_guide/
因为想要聊天需要两个用户才行,随便画个界面,两个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)
}
})
总体参考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>
(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("")
说再多,不如给源码,大家记得在github给个赞,再见了
https://github.com/979451341/JiGuangIMTest
语音通话和视频通话需要开通试用,有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重新执行以上的代码一次,否则你只能通话一次,下次就监听不到了
其实我在做公司项目时,语音、系统表情、文件、还有红包(自定义消息,自己存值)、语音通话、地点、名片都做好了,但是把代码分割出来,太费时间了,所以上面的demo也只有一个 文字消息。官方demo一定要参考,但是不能全照着做,因为依赖太老了,版本适配也有问题,大家如果遇到麻烦可以,在评论区问问题。
如果觉得不够,太基础简单了,可以参考高级篇
文章浏览阅读2.1k次。FX3 JLINK调试是一个有些麻烦的事情,经常有些莫名其妙的问题。 设置参见 c:\Program Files (x86)\Cypress\EZ-USB FX3 SDK\1.3\doc\firmware 下的 EzUsbSuite_UG.pdf 文档。 常见问题: 1.装了多个版本的jlink,使用了未注册或不适当的版本 选择一个正确的版本。JLinkARM_V408l,JLinkA_ezusbsuite_qsg.pdf
文章浏览阅读2.6k次。** 本文仅通过用openGL+QT简单实现二进制stl文件读取显示并通过鼠标旋转缩放, 是比较入门的级别,由于个人能力有限,新手级别,所以未能施加光影灯光等操作, 未能让显示的stl文件更加真实。****效果图:**1. main.cpp```cpp#include "widget.h"#include <QApplication>int main(int argc, char *argv[]){ QApplication a(argc, argv); _qopengl如何鼠标控制旋转
文章浏览阅读943次,点赞22次,收藏19次。以大规模预训练语言模型为基础的chatgpt成功出圈,在近几日已经给人工智能板块带来了多次涨停,这足够说明这一风口的到来。而作为曾经的风口“知识图谱”而言,如何找到其与chatgpt之间的区别,找好自身的定位显得尤为重要。形式化知识和参数化知识在表现形式上一直都是大家考虑的问题,两种技术都应该有自己的定位与价值所在。知识图谱构建往往是抽取式的,而且往往包含一系列知识冲突检测、消解过程,整个过程都能溯源。以这样的知识作为输入,能在相当程度上解决当前ChatGPT的事实谬误问题,并具有可解释性。
文章浏览阅读1.3k次。最重要的一点,一定是degbug的方式启动,不然热部署不会生效,注意,注意!_tomcat热部署
文章浏览阅读10w+次,点赞56次,收藏482次。html5 ,用css去修饰自己的个人主页代码如下:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xh..._个人主页源码
文章浏览阅读201次。开发者(KaiFaX)面向全栈工程师的开发者专注于前端、Java/Python/Go/PHP的技术社区来源:开源最前线链接:https://github.com/svenstaro/gen..._程序员怎么上班摸鱼
文章浏览阅读1.3k次。改变Block UI界面的尺寸_ug二次开发 调整 对话框大小
文章浏览阅读1.3w次,点赞18次,收藏291次。基于深度学习的股票预测数据获取数据转换LSTM模型搭建训练模型预测结果数据获取采用tushare的数据接口(不知道tushare的筒子们自行百度一下,简而言之其免费提供各类金融数据 , 助力智能投资与创新型投资。)python可以直接使用pip安装tushare!pip install tushareCollecting tushare Downloading https://files.pythonhosted.org/packages/17/76/dc6784a1c07ec040e74_基于深度学习的股票操纵识别研究python代码
文章浏览阅读2k次。【IT168 厂商动态】 近日,北京中科网威(NETPOWER)工业级防火墙通过了中国电力工业电力设备及仪表质量检验测试中心(厂站自动化及远动)测试,并成为中国首家通过电力协议访问控制专业测评的工业级防火墙生产厂商。 北京中科网威(NETPOWER)工业级防火墙专为工业及恶劣环境下的网络安全需求而设计,它采用了非X86的高可靠嵌入式处理器并采用无风扇设计,整机功耗不到22W,具备极_电力行业防火墙有哪些
文章浏览阅读206次。/*烟台大学计算机学院 作者:董玉祥 完成日期: 2017 12 3 问题描述:二叉树排序树中查找的路径 */#include #include #define MaxSize 100typedef int KeyType; //定义关键字类型typedef char InfoType;typedef struct node
文章浏览阅读775次。当时老师一定会告诉你,这个一个"warning"的报警,可以不用管它,也确实如此。不过,这条报警信息我们至少可以知道一点,就是scanf函数调用完之后是有一个返回值的,下面我们就要对scanf返回值进行详细的讨论。并给出在编程时利用scanf的返回值可以实现的一些功能。_c语言ignoring return value
文章浏览阅读9.6k次。十四五规划下,数据安全成为国家、社会发展面临的重要议题,《数据安全法》《个人信息保护法》《关键信息基础设施安全保护条例》已陆续施行。如何做好“数据安全建设”是数字时代的必答题。_数字医疗服务保障方案