記錄剛做完的環信+ucloud直播遇到的問題

weixin_33890499發表於2018-04-28
6841181-8778d2fcd4bf7a74.jpg
  • 1.首先環信整合必須新增的
<meta-data
    android:name="EASEMOB_APPKEY"
    android:value="yourHuanxinAppKey"
    /> 

這個appkey必須是在環信後臺配置完成後返回的appkey才可以

  • 2.easeUI中的glide是3.6.1,如果主程式中使用的是4.0以上的,那麼就把easeUI中的版本改成與主moudle相同的版本
    要不然可能會出現:

Error:Execution failed for task ':app:transformDexArchiveWithExternalLibsDexMergerForDebug'.

如果出現這樣的錯誤,也不要著急
找到Androidstudio視窗的右下角 Gradle Console 在這其中的最底部會有一句這樣一句try開頭的錯誤程式碼

Try:
Run with --stacktrace option to get the stack trace. Run with --infoor --debug option to get more log output.
Get more help at https://help.gradle.org

點選try之後的

Run with --stacktrace 

會出現比如像下面格式的錯誤程式碼

java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex
Error:com.android.dex.DexException: Multiple dex files define Lcom/nineoldandroids/animation/ArgbEvaluator;

看到這個,那麼好吧,你已經離解決問題不遠了,這種問題主要是在最後一個類名的身上找突破口,比如Lcom/nineoldandroids/animation/ArgbEvaluator;
中的ArgbEvaluator,雙擊shitf 全域性搜尋一下這個類名,看那些類庫中使用到了,如下圖這樣:

6841181-2d4cc49e69c099dc.png

找到之後把多餘的類庫該刪的刪,該統一版本的統一版本,具體的就看你自己的了。
ps:改完之後不要忘了Clean Project哦!

  • 3.如果直播時傳送資訊不顯示名字
messageView.init(chatroomId);
messageView.setMessageViewListener(new RoomMessagesView.MessageViewListener() {
      @Override
      public void onMessageSend(String content) {
                    EMMessage message = EMMessage.createTxtSendMessage(content, chatroomId);
//                        if (messageView.isBarrageShow) {
//                            message.setAttribute(DemoConstants.EXTRA_IS_BARRAGE_MSG, true);
//                            barrageLayout.addBarrage(content,
//                                    EMClient.getInstance().getCurrentUser());
//                        }
                        message.setChatType(EMMessage.ChatType.ChatRoom);
                        message.setAttribute("nickname", Configure.meBean.getData().getNickname());
                        EMClient.getInstance().chatManager().sendMessage(message);
                        message.setMessageStatusCallback(new EMCallBack() {
                            @Override
                            public void onSuccess() {
                                //重新整理訊息列表
                                messageView.refreshSelectLast();
                            }
                            @Override
                            public void onError(int i, String s) {
showToast("訊息傳送失敗!");
                            }
                            @Override
                            public void onProgress(int i, String s) {
}
});
                    }

修改message.setAttribute中的value值,如果沒有特殊需求一般情況都是修改為在登入時儲存的使用者名稱或者使用更新個人資訊介面中的個人暱稱。

  • 4.如果發起直播或者獲取房間列表無法拉流成功

    把推拉流地址拿到,放到ucloud官方給的demo中測試一下,確定不是推拉流地址的問題

    如果出現錯誤碼401,請試試在進入MainActivity

    • (1) 調一下環信登入介面確保環信的token有效,
    • (2) 而且還要在後臺設定測試手機號或者帳號為主播帳號,
    • (3) 在ucloud後臺的雲直播中配置好初始化的推流地址
  • 5.需要配置的幾個地方

    • (1) application類中進行初始化,並填入後臺給予的secretkey
    • (2) Androidmenifast檔案中,配置APPKEY及相關許可權
    • (3)整合easeUI(注:最好不要直接copy程式碼,以加依賴形式進行新增),
  • 6.如果碰到

Error:com.android.dex.DexException: Multiple dex files define Landroid/support/v4/content/ModernAsyncTask;

這樣的錯誤,莫慌,只要把主專案中的V4包改成與擁有ModernAsyncTask這個類的其他Android自帶類庫的最高版本相同就可以了,具體使這個類顯示出來的方法同上 2中的搜尋方法

  • 7.如果有隻有推流成功,而無法拉流成功

    • 我遇到的情況是放到Ucloud直播demo中依然不行
      在這種情況下請先下載ucloud直播demo,然後把拉流的URL拿出來放到demo中去嘗試,如果demo中無法拉流成功請到ucloud後臺找到雲直播live裡的域名管理,看看有沒有配置好。
  • 8.測試完成需要注意把手機號碼改寫為後臺返回的值,要不然就會導致只能看你寫死的那個手機號發起的直播了。(這一條你可以當做只看看的掠過,畢竟每人的情況不同,我這裡是有了只允許單人直播的限制,所以需要用單個人的帳號或者手機號進行測試)

  • 9.如果專案中之前沒有整合過環信+Ucloud直播那麼在整合完成沒有問題之後,要在登入註冊時都要進行環信的本地登入
    具體程式碼如下:

/***
     * 登入環信
     */
    private void loginHuanxin(final String username, final String password) {
        EMClient.getInstance().login(username,password.toLowerCase(),new EMCallBack() {//回撥
            @Override
            public void onSuccess() {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            List<EMGroup> grouplist = EMClient.getInstance().groupManager().getJoinedGroupsFromServer();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        EMClient.getInstance().groupManager().loadAllGroups();
                        EMClient.getInstance().chatManager().loadAllConversations();
                        Log.d("main", "登入聊天伺服器成功!");
                    }
                }).start();
//                handler.sendEmptyMessage(1);
            }


            @Override
            public void onProgress(int progress, String status) {

            }

            @Override
            public void onError(int code, String message) {
                Log.d("main", "登入聊天伺服器失敗!");
                if (code == EMError.USER_NOT_FOUND){//如果登入環信伺服器失敗,導致使用者名稱找不到時,呼叫環信本地註冊介面方法,註冊方法在下面貼出來
                    RegistHuanxin(username,password);
                }
            }
        });
    }
//註冊環信的方法
 private void RegistHuanxin(final String username,final String pwd) {
        //註冊失敗會丟擲HyphenateException
        new Thread(new Runnable() {
            public void run() {
                try {
                    // call method in SDK
                    EMClient.getInstance().createAccount(username, pwd);
                    runOnUiThread(new Runnable() {
                        public void run() {
                            DemoHelper.getInstance().setCurrentUserName(username);

//                                Toast.makeText(getApplicationContext(), getResources().getString(R.string.Registered_successfully), Toast.LENGTH_SHORT).show();
                        }
                    });
loginHuanxin(username,pwd);//當登入失敗重新註冊時,需要重新登入一下。
                } catch (final HyphenateException e) {
                    runOnUiThread(new Runnable() {
                        public void run() {
                            int errorCode=e.getErrorCode();
                            if(errorCode== EMError.NETWORK_ERROR){
                                Toast.makeText(getApplicationContext(), getResources().getString(R.string.network_anomalies), Toast.LENGTH_SHORT).show();
                            }else if(errorCode == EMError.USER_ALREADY_EXIST){
                                Toast.makeText(getApplicationContext(), getResources().getString(R.string.User_already_exists), Toast.LENGTH_SHORT).show();
                            }else if(errorCode == EMError.USER_AUTHENTICATION_FAILED){
                                Toast.makeText(getApplicationContext(), getResources().getString(R.string.registration_failed_without_permission), Toast.LENGTH_SHORT).show();
                            }else if(errorCode == EMError.USER_ILLEGAL_ARGUMENT){
                                Toast.makeText(getApplicationContext(), getResources().getString(R.string.illegal_user_name),Toast.LENGTH_SHORT).show();
                            }else{
                                Toast.makeText(getApplicationContext(), getResources().getString(R.string.Registration_failed), Toast.LENGTH_SHORT).show();
                            }
                        }
                    });
                }
            }
        }).start();


    }
  • 10.環信+ucloud做直播是除了登入和註冊時需要進行環信的登入之外,你第二次開啟APP,已經是自動登入的狀態下,你的環信是不會自動登入的,所以你就需要一下的解決辦法來緩和一下情緒
    如果在第二次開啟需要在本地進行環信的重新登入,我的辦法是在mainActivity中判斷了token和 環信帳號 不為空時,進行一波環信的登入,是真的虛浮。

待續....

相關文章