使用環(huán)信3.xSDK集成小米推送實現(xiàn)消息以及通話時的離線通知

項目源碼:lzan13 / VMChatDemoCall

前言

集成聊天靠胜,目的無非就是為了讓兩個人能夠方便的溝通脖祈,但是有時我們會退到后臺由境,kill 程序颠锉,這時候別人再發(fā)送消息就收不到了,以及有些用戶還想在呼叫通話時也能通知對方额衙,打開 app 接聽通話饮焦,這些都因為 app 被殺死而實現(xiàn)不了;還好有推送服務(wù)可用窍侧,蘋果有apns县踢,雖然Androidgcm, 但是在國內(nèi)也用不了疏之,因此就催生了各種各樣的第三方推送殿雪,環(huán)信這邊根據(jù)市場設(shè)備情況,選擇了兩家推送集成锋爪,在國內(nèi)可以集成小米和華為推送,這樣可以保證在他們自家的設(shè)備上實現(xiàn)離線消息通知爸业;

PS:為什么不用極光其骄,因為極光并不是國內(nèi)那些 rom 廠商自家的推送服務(wù),他們不允許第三方的服務(wù)器在自家設(shè)備的后臺撒歡
PS:經(jīng)測試小米的多報名在推送上不好使扯旷,不知道現(xiàn)在怎么樣拯爽,如果有使用多包名測試不行的情況,可以重新創(chuàng)建應(yīng)用試下

廢話不多說钧忽,今天就通過集成最新的小米推送來實現(xiàn)下消息的離線推送通知毯炮,以及被呼叫方離線時方推送提醒對方啟動 app 接聽通話;其實都是通過集成推送完成耸黑!

準(zhǔn)備工作

首先你的項目需要集成環(huán)信 sdk桃煎,并且已經(jīng)實現(xiàn)了發(fā)送消息以及音視頻通話功能(這個可以直接用我上邊 github 上的項目);
然后你需要有小米的開發(fā)者賬戶大刊,需要創(chuàng)建一個應(yīng)用为迈,包名要和你自己的項目一樣,然后需要用到的就是應(yīng)用的appIdappKey葫辐、appSecret搜锰,這些在環(huán)信開發(fā)者后臺上傳小米證書,以及在項目中初始化小米推送需要用到耿战;

開始集成

首先這邊先把證書弄好了蛋叼,證書的名字和秘鑰以及包名一定要對應(yīng):


QQ20170505-162024.png

然后需要做的就是在代碼中集成小米推送,需要做的有兩個地方:

  1. 在初始化 sdk 的時候調(diào)用 options 設(shè)置小米的 appId 和 appKey
  2. 在 AndroidManifest配置文件配置相應(yīng)的權(quán)限和廣播接收器以及服務(wù)
    /**
     * 初始化環(huán)信sdk剂陡,并做一些注冊監(jiān)聽的操作鸦列,這里把其他的處理都去掉了只寫了小米推送
     */
    private void initHyphenate() {
        // 初始化sdk的一些配置
        EMOptions options = new EMOptions();
        // 設(shè)置小米推送 appID 和 appKey
        options.setMipushConfig("2882303761517573806", "5981757315806");
        // 初始化環(huán)信SDK,一定要先調(diào)用init()
        EMClient.getInstance().init(context, options);
        // 開啟 debug 模式
        EMClient.getInstance().setDebugMode(true);
    }

然后就是AndroidManifest配置

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.vmloft.develop.app.demo.call">

    <!-- 項目權(quán)限配置 -->
    <!--小米推送相關(guān)權(quán)限-->
    <permission
        android:name="com.vmloft.develop.app.demo.call.permission.MIPUSH_RECEIVE"
        android:protectionLevel="signature"/>
    <uses-permission android:name="com.vmloft.develop.app.demo.call.permission.MIPUSH_RECEIVE"/>
    <!--小米推送權(quán)限 end-->
    <!--程序入口-->
    <application
        android:name="com.vmloft.develop.app.demo.call.AppApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:largeHeap="true"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        ...
        <!--小米推送相關(guān)配置-->
        <service
            android:name="com.xiaomi.push.service.XMJobService"
            android:enabled="true"
            android:exported="false"
            android:permission="android.permission.BIND_JOB_SERVICE"
            android:process=":pushservice"/>

        <service
            android:name="com.xiaomi.push.service.XMPushService"
            android:enabled="true"
            android:process=":pushservice"/>

        <service
            android:name="com.xiaomi.mipush.sdk.PushMessageHandler"
            android:enabled="true"
            android:exported="true"/>
        <service
            android:name="com.xiaomi.mipush.sdk.MessageHandleService"
            android:enabled="true"/>

        <!--推送消息廣播接收器,這個廣播接收器必須繼承自環(huán)信實現(xiàn)的接收器-->
        <receiver
            android:name=".push.MIPushReceiver"
            android:exported="true">
            <intent-filter>
                <action android:name="com.xiaomi.mipush.RECEIVE_MESSAGE"/>
            </intent-filter>
            <intent-filter>
                <action android:name="com.xiaomi.mipush.MESSAGE_ARRIVED"/>
            </intent-filter>
            <intent-filter>
                <action android:name="com.xiaomi.mipush.ERROR"/>
            </intent-filter>
        </receiver>
        <receiver
            android:name="com.xiaomi.push.service.receivers.NetworkStatusReceiver"
            android:exported="true">
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>

                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </receiver>
        <receiver
            android:name="com.xiaomi.push.service.receivers.PingReceiver"
            android:exported="false"
            android:process=":pushservice">
            <intent-filter>
                <action android:name="com.xiaomi.push.PING_TIMER"/>
            </intent-filter>
        </receiver>
        <!--小米推送配置 end-->
    </application>
</manifest>

其中MIPushReceiver這個廣播接收器可以不用自己實現(xiàn)鹏倘,如果自己實現(xiàn)薯嗤,必須繼承自環(huán)信 sdk 實現(xiàn)的廣播接收器EMMipushReceiver實現(xiàn),也可以直接用(這里如果需要自己與自己的業(yè)務(wù)處理可以繼承環(huán)信實現(xiàn)的的這個廣播接收器纤泵,不然收不到離線推送骆姐,然后去處理自己的邏輯;詳細可以根據(jù)小米推送官方 sdk 文檔進行了解下)捏题;

當(dāng)我們做完這些之后在收到離線消息后就可以收到推送通知了玻褪,只不過這個推送通知我們不能自定義,因為這些都是服務(wù)器推什么我們接受什么公荧,這點比較坑带射!

通話的離線通知

上邊已經(jīng)實現(xiàn)了消息的離線通知,我們下邊就要做當(dāng)呼叫對方時循狰,對方卻不在線窟社,我們怎么通知對方打開 app 進行接聽呢?
曾經(jīng)集成過環(huán)信用戶應(yīng)該知道绪钥,在呼叫對方不在線后會馬上結(jié)束通話灿里,回調(diào)對方不在線,在新版3.2.2的 sdk 中新增設(shè)置音視頻參數(shù)及呼叫時對方離線是否發(fā)推送的接口程腹,在初始化的時候進行以下設(shè)置:

// 設(shè)置通話過程中對方如果離線是否發(fā)送離線推送通知匣吊,默認(rèn) false
EMClient.getInstance().callManager().getCallOptions().setIsSendPushIfOffline(true);
// 設(shè)置了這個之后就不會在通話狀態(tài)監(jiān)聽中回調(diào)對方不在線,需要實現(xiàn)另外一個回調(diào)
...
// 設(shè)置音頻通話推送提供者寸潦,在 onRemoteOffline()回調(diào)中給對方發(fā)送消息就行了
EMClient.getInstance().callManager().setPushProvider(EMCallManager.EMCallPushProvider {
    @Override public void onRemoteOffline(String username) {
        EMMessage message = EMMessage.createTxtSendMessage("有人呼叫你色鸳,開啟 APP 接聽吧", username);
        // 設(shè)置強制推送
        message.setAttribute("em_force_notification", "true");
        // 設(shè)置自定義推送提示
        JSONObject extObj = new JSONObject();
        try {
            extObj.put("em_push_title", "有人呼叫你,開啟 APP 接聽吧");
            extObj.put("extern", "定義推送擴展內(nèi)容");
        } catch (JSONException e) {
            e.printStackTrace();
        }
        message.setAttribute("em_apns_ext", extObj);
        message.setMessageStatusCallback(new EMCallBack() {
            @Override public void onSuccess() {
              // 在這里可以刪除消息
            }
            @Override public void onError(int i, String s) {
              // 在這里可以刪除消息
            }
            @Override public void onProgress(int i, String s) {}
        });
        EMClient.getInstance().chatManager().sendMessage(message);
    }
});

實現(xiàn)了上邊的這個推送提供者之后见转,當(dāng)對方不在線就會回調(diào) onRemoteOffline()方法命雀,就可以發(fā)送一條消息給對方,然后上邊我們已經(jīng)集成了小米推送池户,就可以通過離線推送的方式通知對方有新消息咏雌,對方看到后點擊通知欄就可以打開 app了凡怎,這個時候我們的語音或視頻呼叫還在一直呼叫,然后就可以連通了赊抖!

結(jié)語

OK 到這里基本就已經(jīng)完成了统倒,大家可以運行自己的項目,或者我上邊的 demo 測試下氛雪,我這邊通過小米5測試 OK房匆;其實集成推送部分并不難,只是有幾點需要注意:

  • 環(huán)信開發(fā)者后臺的推送證書設(shè)置時一定要注意應(yīng)用包名和小米推送后臺的應(yīng)用包名以及自己項目的包名报亩,三個地方一定要一致
  • 初始化設(shè)置一定要通過環(huán)信的 options 去設(shè)置小米推送的 appId 和 appKey浴鸿,不需要用小米的注冊方法自己注冊;
  • Androidmanifest 一定要加上環(huán)信的廣播接收器弦追,或者繼承自環(huán)信封裝的廣播接收器

注意以上幾點基本推送就沒有問題了岳链,如果不行可以先通過小米開發(fā)者后臺的推送工具測試推送是否通了,然后檢查以上幾點劲件;

PS:華為推送相關(guān)其實一樣掸哑,不過因為華為不允許個人開發(fā)者注冊賬戶,所以這里暫時不贅述

參考資料

小米推送Android SDK文檔
環(huán)信推送相關(guān)文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末零远,一起剝皮案震驚了整個濱河市苗分,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌牵辣,老刑警劉巖摔癣,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異纬向,居然都是意外死亡择浊,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門罢猪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來近她,“玉大人,你說我怎么就攤上這事膳帕。” “怎么了薇缅?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵危彩,是天一觀的道長。 經(jīng)常有香客問我泳桦,道長汤徽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任灸撰,我火速辦了婚禮谒府,結(jié)果婚禮上拼坎,老公的妹妹穿的比我還像新娘。我一直安慰自己完疫,他們只是感情好泰鸡,可當(dāng)我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著壳鹤,像睡著了一般盛龄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機與錄音适肠,去河邊找鬼贷掖。 笑死,一個胖子當(dāng)著我的面吹牛骨宠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼挟憔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了库正?” 一聲冷哼從身側(cè)響起曲楚,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎褥符,沒想到半個月后龙誊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡喷楣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年趟大,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铣焊。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡逊朽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出曲伊,到底是詐尸還是另有隱情叽讳,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布坟募,位于F島的核電站岛蚤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏懈糯。R本人自食惡果不足惜涤妒,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赚哗。 院中可真熱鬧她紫,春花似錦硅堆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至围详,卻和暖如春朴乖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背助赞。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工买羞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人雹食。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓畜普,卻偏偏與公主長得像,于是被迫代替她去往敵國和親群叶。 傳聞我的和親對象是個殘疾皇子吃挑,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容

  • 最近一段時間工作量比較大, 抽不出時間來整理博客, 趁今天任務(wù)量較小的時候整理下關(guān)于環(huán)信推送的問題, 介紹. 集成...
    imGeek閱讀 2,715評論 1 3
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,304評論 25 707
  • 點擊查看原文 Web SDK 開發(fā)手冊 SDK 概述 網(wǎng)易云信 SDK 為 Web 應(yīng)用提供一個完善的 IM 系統(tǒng)...
    layjoy閱讀 13,786評論 0 15
  • 極光推送: 1.JPush當(dāng)前版本是1.8.2,其SDK的開發(fā)除了正常的功能完善和擴展外也緊隨蘋果官方的步伐街立,SD...
    Isspace閱讀 6,724評論 10 16
  • 介紹查爾斯.狄更斯的小說《圣誕歡歌》舶衬。 一、故事簡介與文學(xué)價值 1赎离、主要故事情節(jié) 富有而冷漠無情的逛犹、自私透頂?shù)牧邌?..
    爺有蔓草閱讀 654評論 0 0