• 即时通讯(IM-instant messager)


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

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

    其次,即时通讯肯定需要服务器端(Openfire)和客户端(Spark)。 
    Openfire,spark和smack三者的关系如下: 
    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);

  • 相关阅读:
    Linux6
    大小超过2t的分区规划 parted命令
    fdisk命令磁盘分区
    扩展
    磁盘管理
    在Linux中如何手动创建一个用户
    Linux5
    Linux4
    19_权限和分组
    18_django的用户模型和扩展django的用户模型
  • 原文地址:https://www.cnblogs.com/dubo-/p/5586003.html
Copyright © 2020-2023  润新知