即时通讯又叫实时通讯,简单来说就是两个及以上的人使用网络进行文字文件语音视频的交流。

首先,进行网络进行通信,肯定需要网络协议,即时通讯专用的协议就是xmpp。xmpp协议要传递的消息类型是xml格式的。 
http协议的实现类是socket,xmpp协议的实现类叫smack。

其次,即时通讯肯定需要服务器端(Openfire)和客户端(Spark)。 
Openfire,spark和smack三者的关系如下: 

即时通讯发送消息的方式有四种: 
- 即时在线通讯:两个人都在线 
- 即时代理通讯:两个人都在线,但由于网络或其他问题消息发送不到,先将消息发送到服务器,再又服务器转发给对方 
- 离线通讯:对方不在线,由服务器暂存,对方在线时再发给对方 
- 其他方式:对方不在线,通过短信或邮件等方式告知对方


下面基于环信的三方SDK,进行一个简要的开发。

1. 在官网中获取appkey

填入应用名、描述、包名等信息获取appkey

2. 服务器端

这里对服务器端不做介绍。。。

3. 客户端:

  1. 下载并导入SDK 
    SDK中会有一个Demo,直接运行就能达到即时通讯的功能了,但是要将代码融入
  2. 配置信息 
    在清单文件AndroidManifest.xml里加入以下权限,以及写上你注册的appkey

权限配置(实际开发中可能需要更多的权限,可参考demo):

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="Your Package"
android:versionCode="100"
android:versionName="1.0.0"> <!-- Required -->
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:name="Your Application"> <!-- 设置环信应用的appkey -->
<meta-data android:name="EASEMOB_APPKEY" android:value="Your AppKey" />
<!-- 声明sdk所需的service SDK核心功能-->
<service android:name="com.hyphenate.chat.EMChatService" android:exported="true"/>
<!-- 声明sdk所需的receiver -->
<receiver android:name="com.hyphenate.chat.EMMonitorReceiver">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_REMOVED"/>
<data android:scheme="package"/>
</intent-filter>
<!-- 可选filter -->
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.USER_PRESENT" />
</intent-filter>
</receiver>
</application>
</manifest>
  1. app打包混淆

在proguard文件中加入以下keep

-keep class com.hyphenate.** {*;}
-dontwarn com.hyphenate.**

发送消息

配置完成就可以发送消息了

1. 发送文本消息

//创建一条文本消息,content为消息文字内容,toChatUsername为对方用户或者群聊的id,后文皆是如此
EMMessage message = EMMessage.createTxtSendMessage(content, toChatUsername);
//如果是群聊,设置chattype,默认是单聊
message.setChatType(ChatType.GroupChat);
//发送消息
EMClient.getInstance().chatManager().sendMessage(message);

2. 发送语音消息

//filePath为语音文件路径,length为录音时间(秒)
EMMessage message = EMMessage.createVoiceSendMessage(filePath, length, toChatUsername);
//如果是群聊,设置chattype,默认是单聊
message.setChatType(ChatType.GroupChat);
EMClient.getInstance().chatManager().sendMessage(message);

3. 发送视频消息

//videoPath为视频本地路径,thumbPath为视频预览图路径,videoLength为视频时间长度
EMMessage message = EMMessage.createVideoSendMessage(videoPath, thumbPath, videoLength, toChatUsername);
//如果是群聊,设置chattype,默认是单聊
message.setChatType(ChatType.GroupChat);
EMClient.getInstance().chatManager().sendMessage(message);

4. 发送图片消息

//imagePath为图片本地路径,false为不发送原图(默认超过100k的图片会压缩后发给对方),需要发送原图传false
EMMessage.createImageSendMessage(imagePath, false, toChatUsername);
//如果是群聊,设置chattype,默认是单聊
message.setChatType(ChatType.GroupChat);
EMClient.getInstance().chatManager().sendMessage(message);

接收消息

通过注册消息监听来接收消息

EMClient.getInstance().chatManager().addMessageListener(msgListener);
EMMessageListener msgListener = new EMMessageListener() { @Override
public void onMessageReceived(List<EMMessage> messages) {
//收到消息
} @Override
public void onCmdMessageReceived(List<EMMessage> messages) {
//收到透传消息
} @Override
public void onMessageReadAckReceived(List<EMMessage> messages) {
//收到已读回执
} @Override
public void onMessageDeliveryAckReceived(List<EMMessage> message) {
//收到已送达回执
} @Override
public void onMessageChanged(EMMessage message, Object change) {
//消息状态变动
}
};

记得在不需要的时候移除listener,如在activity的onDestroy()时 
EMClient.getInstance().chatManager().removeMessageListener(msgListener);

即时通讯(IM-instant messager)的更多相关文章

  1. IM即时通讯实现原理

      即时通讯(Instant Messenger,简称IM)软件多是基于TCP/IP和UDP进行通讯的,TCP/IP和UDP都是建立在更低层的IP协议上的两种通讯传输协议.前 者是以数据流的形式,将传 ...

  2. Android WebSocket实现即时通讯功能

    最近做这个功能,分享一下.即时通讯(Instant Messaging)最重要的毫无疑问就是即时,不能有明显的延迟,要实现IM的功能其实并不难,目前有很多第三方,比如极光的JMessage,都比较容易 ...

  3. 即时通讯IM

    即时通讯(Instant Messaging,后简称im)消息的可靠投递 一.报文类型 im的客户端与服务器通过发送报文(也就是网络包)来完成消息的传递 报文分为: 请求报文(request,后简称为 ...

  4. 杂项-IM:IM(即时通讯),一种基于互联网的即时交流消息的业务

    ylbtech-杂项-IM:IM(即时通讯),一种基于互联网的即时交流消息的业务 即时通讯(Instant Messaging)是目前Internet上最为流行的通讯方式,各种各样的即时通讯软件也层出 ...

  5. ubuntu server激活即时通讯IM服务 Instant Messaging is not activated on this server

    转自:http://shine-it.net/index.php/topic,16469.msg28364.html ubuntu server 下 odoo激活及时通讯功能im OpenERP IM ...

  6. xmpp即时通讯的笔记(摘抄)

    xmpp的使用: 即时通讯 instant messaging(IM) :  -->实时收发信息! 即时通讯相关软件: **QQ,MSN,GoogleTalk,AIM,Jabber(XMPP别名 ...

  7. openfire+asmack搭建的安卓即时通讯(一) 15.4.7

    最进开始做一些android的项目,除了一个新闻客户端的搭建,还需要一个实现一个即时通讯的功能,参考了很多大神成型的实例,了解到operfire+asmack是搭建简易即时通讯比较方便,所以就写了这篇 ...

  8. 基于XMPP协议的手机多方多端即时通讯方案

    一.开发背景 1.国际背景 随着Internet技术的高速发展,即时通信已经成为一种广泛使用的通信方式.1996年Mirabilis公司推出了世界上第一个即时通信系统ICQ,不到10年间,即时通信(I ...

  9. 基于Android 平台简易即时通讯的研究与设计[转]

    摘要:论文简单介绍Android 平台的特性,主要阐述了基于Android 平台简易即时通讯(IM)的作用和功能以及实现方法.(复杂的通讯如引入视频音频等可以考虑AnyChat SDK~)关键词:An ...

随机推荐

  1. cxTreeList 控件说明

    树.cxTreeList 属性: Align:布局,靠左,靠右,居中等 AlignWithMargins:带边框的布局 Anchors:停靠 (akTop上,akBottom下,akLeft左,akR ...

  2. java web 学习 --第三天(Java三级考试)

    第二天的学习内容这里:http://www.cnblogs.com/tobecrazy/p/3446646.html Jsp中的动作标签 <jsp:include> 实现动态包含,在一个文 ...

  3. WdatePicker组件不显示

    突然发现时间组件不显示了,以为是浏览器的问题.在本地服务器测试了一下发现一切正常. 怀疑是前段时间中毒引起的,用工具比对了一下WdatePicker的文件包,发现My97DatePicker.htm这 ...

  4. HDU 4949 Light(插头dp、位运算)

    比赛的时候没看题,赛后看题觉得比赛看到应该可以敲的,敲了之后发现还真就会卡题.. 因为写完之后,无限TLE... 直到后来用位运算代替了我插头dp常用的decode.encode.shift三个函数以 ...

  5. 【leetcode】Pascal's Triangle I & II (middle)

    Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Retur ...

  6. 【python】入门学习(十)

    #入门学习系列的内容均是在学习<Python编程入门(第3版)>时的学习笔记 统计一个文本文档的信息,并输出出现频率最高的10个单词 #text.py #保留的字符 keep = {'a' ...

  7. 20145213 《Java程序设计》实验四 Android开发基础

    20145213 <Java程序设计>实验四 Android开发基础 说在前面的话 不同以往实验,对于这次实验具体内容我是比较茫然的.因为点我,打开实验四的链接居然能飘出一股熟悉的味道,这 ...

  8. Hibernate创建hqll时报错

    Hibernate 问题,在执行Query session.createQuery(hql) 报错误 出错截图: 这条语句在java运行环境下,直接连数据库不出错,如果在hiberante,strut ...

  9. 网站上点击自定义按钮发起QQ聊天的解决方案

    一.背景 最近由于开发需要,需要在网站上自定义一个立即交谈的按钮,现将解决方式分享给大家. 二.解决方案 1.首先访问:http://shang.qq.com/widget/consult.php,适 ...

  10. SQL Server多表多列更新

    student表: lag表: 要求将student表stu_id列为1的stu_nick列和stu_phont列的数据更新为lag表的lag_nick列和lag_phone列. SQL语句: upd ...