即時通信(IM-instant messager)

即時通信又叫實時通信,簡單來講就是兩個及以上的人使用網絡進行文字文件語音視頻的交流。

首先,進行網絡進行通訊,確定須要網絡協議,即時通信專用的協議就是xmpp。xmpp協議要傳遞的消息類型是xml格式的。 
http協議的實現類是socket,xmpp協議的實現類叫smack。android

其次,即時通信確定須要服務器端(Openfire)和客戶端(Spark)。 
Openfire,spark和smack三者的關係以下: 
Openfire,spark和smack三者的關係服務器

即時通信發送消息的方式有四種: 
- 即時在線通信:兩我的都在線 
- 即時代理通信:兩我的都在線,但因爲網絡或其餘問題消息發送不到,先將消息發送到服務器,再又服務器轉發給對方 
- 離線通信:對方不在線,由服務器暫存,對方在線時再發給對方 
- 其餘方式:對方不在線,經過短信或郵件等方式告知對方網絡


下面基於環信的三方SDK,進行一個簡要的開發。app

1. 在官網中獲取appkey

填入應用名、描述、包名等信息獲取appkeysocket

2. 服務器端

這裏對服務器端不作介紹。。。ide

3. 客戶端:

  1. 下載並導入SDK 
    SDK中會有一個Demo,直接運行就能達到即時通信的功能了,可是要將代碼融入
  2. 配置信息 
    在清單文件AndroidManifest.xml里加入如下權限,以及寫上你註冊的appkey

權限配置(實際開發中可能須要更多的權限,可參考demo):ui

<?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文件中加入如下keepspa

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

發送消息

配置完成就能夠發送消息了.net

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);

相關文章
相關標籤/搜索