首先,進行網絡進行通訊,確定須要網絡協議,即時通信專用的協議就是xmpp。xmpp協議要傳遞的消息類型是xml格式的。
http協議的實現類是socket,xmpp協議的實現類叫smack。android
其次,即時通信確定須要服務器端(Openfire)和客戶端(Spark)。
Openfire,spark和smack三者的關係以下:
服務器
即時通信發送消息的方式有四種:
- 即時在線通信:兩我的都在線
- 即時代理通信:兩我的都在線,但因爲網絡或其餘問題消息發送不到,先將消息發送到服務器,再又服務器轉發給對方
- 離線通信:對方不在線,由服務器暫存,對方在線時再發給對方
- 其餘方式:對方不在線,經過短信或郵件等方式告知對方網絡
下面基於環信的三方SDK,進行一個簡要的開發。app
填入應用名、描述、包名等信息獲取appkeysocket
這裏對服務器端不作介紹。。。ide
權限配置(實際開發中可能須要更多的權限,可參考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>
在proguard文件中加入如下keepspa
-keep class com.hyphenate.** {*;} -dontwarn com.hyphenate.**
配置完成就能夠發送消息了.net
//建立一條文本消息,content爲消息文字內容,toChatUsername爲對方用戶或者羣聊的id,後文皆是如此 EMMessage message = EMMessage.createTxtSendMessage(content, toChatUsername); //若是是羣聊,設置chattype,默認是單聊 message.setChatType(ChatType.GroupChat); //發送消息 EMClient.getInstance().chatManager().sendMessage(message);
//filePath爲語音文件路徑,length爲錄音時間(秒) EMMessage message = EMMessage.createVoiceSendMessage(filePath, length, toChatUsername); //若是是羣聊,設置chattype,默認是單聊 message.setChatType(ChatType.GroupChat); EMClient.getInstance().chatManager().sendMessage(message);
//videoPath爲視頻本地路徑,thumbPath爲視頻預覽圖路徑,videoLength爲視頻時間長度 EMMessage message = EMMessage.createVideoSendMessage(videoPath, thumbPath, videoLength, toChatUsername); //若是是羣聊,設置chattype,默認是單聊 message.setChatType(ChatType.GroupChat); EMClient.getInstance().chatManager().sendMessage(message);
//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);