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

首先,进行网络进行通信,肯定需要网络协议,即时通讯专用的协议就是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. Light OJ 1068

    数位DP #include <cstdio> #include <cstring> using namespace std; ; ; long long n; int f[MA ...

  2. 解读Unity中的CG编写Shader系列十 (光滑的镜面反射(冯氏着色))

    前文完成了最基本的镜面反射着色器,单平行光源下的逐顶点着色(per-vertex lighting),又称为古罗着色(Gouraud shading).这篇文章作为后续讨论更光滑的镜面反射方式,逐像素 ...

  3. Java Thread.join()方法

    一.使用方式. join是Thread类的一个方法,启动线程后直接调用,例如: Thread t = new AThread(); t.start(); t.join(); 二.为什么要用join() ...

  4. pycharm的安装

    打开PyCharm官网http://www.jetbrains.com/pycharm/,选择Download,进入下载页面. 这时会出现2个版本,左边的那个是购买版,可以试用30天:右边那个是社区版 ...

  5. Android 中沉浸式状态栏实现

    Android 中沉浸式状态栏实现方式如下 计算状态栏高度及调用沉浸式状态栏的相关API方法 package com.example.status; import android.annotation ...

  6. 51nod 1099 任务执行顺序 (贪心算法)

    题目:传送门. 题意:中文题. 题解:r[i]-o[i]值大的先进行.反证法:如果大的后进行,会导致空间增大,所以一定大的是先进行. #include <iostream> #includ ...

  7. jpg Test

  8. NYOJ题目769乘数密码

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsQAAAJYCAIAAADqk2fsAAAgAElEQVR4nO3dPVLrytbG8XcS5AyEWA

  9. 通过btn获取所在cell

    [cell.btn addTarget:self action:@selector(cellBtnClicked:event:) forControlEvents:UIControlEventTouc ...

  10. Eclipse的使用及Java程序的标识符和关键字

    Eclipse的使用 (1)创建Java项目 选择“文件”/“新建”/“Java项目”命令,在弹出的“新建Java项目”对话框输入项目名,然后点击“下一步”,最后单击“完成”. (2)创建Java类文 ...