天天看點

如何快速的內建環信,并高效的使用

一、前言

最近,公司準備內建一個即時通訊的功能,于是我找到了環信,于是我就這樣被坑了,于是就有了本文來教大家如何跳出我踩過的坑,于是……

說環信比較坑并不是它們的産品不好,相反它們的功能做得還不錯(本人承諾絕對不是托),而是它們寫的文檔真的是太亂了,一不小心你就會入坑(還好環信的技術客服還算給力,很多問題都能詳細的給你回答)。

主要展現在EaseUI的使用和文檔寫的有差距(你可以看看),但是文檔并沒有标明,還有就是某些方法的調用寫得不是很清楚。官方demo居然還是用Eclipse寫的,用AS導入也是各種麻煩,加之官方demo裡面有些功能我用不上,于是就想到自己寫demo。

二、效果圖

下面就是我寫的demo的效果圖(PS:由于趕時間給老大看效果,沒有時間去美化頁面,還有就是模拟器中使用位置會報錯,所有就沒有示範發送位置資訊了),你可以在這裡下載下傳安裝包APK檔案去運作看看。

如何快速的內建環信,并高效的使用

三、有哪一些坑

導包(跟着文檔來的話就麻煩了);

初始化(一不注意就出錯);

減小apk大小(導入EaseUI之後安裝包大小接近18M);

發送圖檔之後,檢視大圖崩潰(文檔不完整);

擷取聯系人(你會發現根本沒有這個方法,要自己寫,并且必須要在子線程中執行);

設定預設加載一條消息無效(options.setNumberOfMessagesLoaded(1));

你會發現發送不了位置資訊(這個文檔裡面真沒找到);

添加/删除好友之後沒反應(文檔裡面并沒有給出解決方案);

有時候,明明已經按文檔配置了,但是很多效果出不來;

最狗血的就是EaseUI沒有适配到Android6.0(下面解決方案給出);

環信,陌生人之間是可以聊天的。

看到這麼多坑你就知道我是怎麼過來的了!希望在弄環信的“同胞們”能看到這些,少走一些彎路吧。
           

四、解決方案

4.1、導包

整個項目隻用導入EaseUI就可以了,不要再在你的項目中導入SDK中的libs裡面的jar包和jin檔案了,因為EaseUI裡面已經包含得有了。具體方式為:先下好EaseUI,在建立好的項目中File->New->import Module->你的EaseUI路徑->finished
           

4.2、初始化

初始化的方法确實是按文檔的方法來初始化的(放到MyApplication中),比較坑的就是,如果你要使用EaseUI就必須要用下面的方法來初始化方法,而不是文檔一開始的那種方式:


EMOptions options = new EMOptions();
        options.setMipushConfig("2882303761517500800", "5371750035800");//小米推送的
        // 預設添加好友時,是不需要驗證的,改成需要驗證,true:自動驗證,false,手動驗證
        options.setAcceptInvitationAlways(true);
        //初始化
        EaseUI.getInstance().init(this, options);
        //在做打包混淆時,關閉debug模式,避免消耗不必要的資源------***注意這個不要加,要了會報錯***
//        EMClient.getInstance().setDebugMode(true);
           

4.3、減小APK大小

這個确實就得看你的業務需求來了,如果需要實時通話(包含視訊)的請忽略本條。方法:到EaseUI檔案夾下(項目中選中easeui右鍵–>Show in Explorer),找到所有包含得有“av”的檔案删除,還有不需要小米推送,谷歌支付,谷歌推送,華為推送的可以将相應的jar包删除。這樣下來生成的安裝包就變為6M多點(基本在能接受的範圍了)。
           

4.4、檢視大圖崩潰

之所有會崩潰是因為沒有在清單檔案(AndroidManifest.xml)中配置檢視圖檔的Activity,具體配置如下:

<activity
            android:name="com.hyphenate.easeui.ui.EaseShowBigImageActivity"
            android:screenOrientation="portrait"
            android:theme="@style/horizontal_slide" />
           

4.5、擷取聯系人

1)、擷取聯系人:

contactListFragment = new EaseContactListFragment();
        new Thread() {//需要在子線程中調用
            @Override
            public void run() {
                //需要設定聯系人清單才能啟動fragment
                contactListFragment.setContactsMap(getContact());
            }
        }.start();
           

2)、getContact方法:

/**
     * 擷取聯系人
     * @return
     */
    private Map<String, EaseUser> getContact() {
        Map<String, EaseUser> map = new HashMap<>();
        try {
            List<String> userNames =                     EMClient.getInstance().contactManager().getAllContactsFromServer();
//            KLog.e("......有幾個好友:" + userNames.size());
            for (String userId : userNames) {
//                KLog.e("好友清單中有 : " + userId);
                map.put(userId, new EaseUser(userId));
            }
        } catch (HyphenateException e) {
            e.printStackTrace();
        }
        return map;
    }
           

4.6、設定預設加載一條消息無效

options.setNumberOfMessagesLoaded(1);此方法設定無效

額額額,這個真的很想吐槽一下,3.X版本已經啟用這個功能了,但是文檔裡面居然還有
           

4.7、不能發送位置資訊

好吧,其實想想也知道,它們也是內建的第三方的百度地圖,是以是需要去百度地圖開發者中心申請appkey的,申請很簡單、也很快,最後在清單檔案中配置已一下就可以了。


<!-- //key:開發者申請的key -->
   <service
            android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote" />

        <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="這個就是你申請的appkey了" />
           

4.8、添加/删除好友之後沒反應

首先,需要在管理通訊錄ContactListFragment的那個activity中監聽好友狀态。其次,在狀态回調方法中重新整理contactListFragment.refresh(),還沒完最後還要在子線程中調用一下擷取好友清單的方法,不多說看代碼:

4.9、有時候,明明已經按文檔配置了,但是很多效果出不來

這個應該不算環信的坑了,大多數用as的都可能出現。終極解決辦法就是重構項目Builde->Rebuilde Project
           

4.10、适配Android6.0的手機

要知道,demo運作到Android6.0的手機是各種報錯,這主要是由于Google出于安全考慮在6.0之後加入動态權限,即敏感操作需要獲得使用者的授權;這個錯誤隻在官方的demo裡面有解決方案(沒時間去研究它們demo的有福了),

看步驟:先下載下傳官方demo,在裡面找到runtimepermissions檔案夾,将這個檔案夾拷貝到你的項目中,當然你要是嫌麻煩可以點選這裡下載下傳;然後在你的項目的MainActivity中加入下面的代碼就可以了。

      /**
             * 請求所有必要的權限----原理就是擷取清單檔案中申請的權限
             */
            PermissionsManager.getInstance().requestAllManifestPermissionsIfNecessary(this, new PermissionsResultAction() {
                @Override
                public void onGranted() {
    //              Toast.makeText(MainActivity.this, "All permissions have been granted", Toast.LENGTH_SHORT).show();
                }

                @Override
                public void onDenied(String permission) {
                    //Toast.makeText(MainActivity.this, "Permission " + permission + " has been denied", Toast.LENGTH_SHORT).show();
                }
            });
           

4.11、實作陌生人之間聊天

其實,環信是允許陌生人之間聊天的。具體實作很多,原理就是要給一個username作為入口。

下面提供一種解決方案:從伺服器傳遞一個陌生人的清單(隻要有使用者名名都可以),然後點選的這個清單的時候,跳轉到聊天頁面就可以了

五、總結

總算是寫完,希望給還沒有入坑的同胞們一些啟示。雖然說環信的坑比較多(我歸咎于它們的文檔寫得不好,希望有所改進吧),但是它們的功能還是可以的,聽說已經加入了紅包功能了,有時間的時候去看看。

六、Demo下載下傳

這裡是Demo的下載下傳位址

繼續閱讀