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

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

    今日,Sort Benchmark 在官方网站公布了 2015 年排序竞赛的最终成绩.其中,阿里云用不到 7 分钟(377 秒)就完成了 100TB 的数据排序,打破了 Apache Spark 的纪 ...

  2. TransactionScope类

    命名空间:System.Transactons MSDN解释:使代码块成为事务性代码,此类不能被继承. 百度空间:在项目中引用using System.Transaction命名空间.在using 中 ...

  3. FFmpeg-20160506-snapshot-bin

    ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 S 下一帧 [ -2秒 ] +2秒 ; -1秒 ' +1秒 下一个帧 -> -5秒 F ...

  4. a byte of python(摘04)

    a byte of python 第十章 输入/输出 如何使程序和用户进行交互?(用 raw_input 和 print语句来完成) 对于输出,你也可以使用多种多样的 str(字符串)类.使用 rju ...

  5. Divide and conquer:Moo University - Financial Aid(POJ 2010)

    Moo University - Financial Aid 其实是老题了http://www.cnblogs.com/Philip-Tell-Truth/p/4926008.html 这一次我们换二 ...

  6. 【工具】 原版完美激活 Flash builder 4.7 【非破解激活】

    此方法原理在于激活 FlashBuilder 4.7 而不是破解(靠修改文件,或改变版本号),所以此破解更加稳定! FlashBuilder 4.7 下载地址: 32bit:http://trials ...

  7. UIDynamic动画

    UIDynamic是从iOS7开始引入的技术 属于UIkit框架 可以模拟显示生活中的物理现象 如碰撞 抖动 摆动等 一.使用UIDynamic步骤: 1.创建一个动力效果器UIDynamicAnim ...

  8. android bitmap的放大缩小

    private static Bitmap big(Bitmap bitmap) { Matrix matrix = new Matrix(); matrix.postScale(1.5f,1.5f) ...

  9. iOS开发中调试小技巧

    对于软件开发而言,调试是必须学会的技能,重要性不言而喻.对于调试的技能,基本上是可以迁移的,也就是说你以前在其他平台上掌握的很多调试技巧,很多也是可以用在iOS开发中.不同语言.不同IDE.不同平台的 ...

  10. Linux下第一次使用MySQL数据库,设置密码

    在终端下输入:/etc/rc.d/init.d/mysqld status 查看MySQL状态,看看是否运行. 没有运行的话就输入:/etc/rc.d/init.d/mysqld start 这时,就 ...