Android實現融雲翻譯並替換聊天內容
0.需求
客戶採用的是融雲第三方聊天,需要實現長按聊天資訊翻譯並將結果替換原來的文字展示。
1.效果
直接看效果。

QQ圖片20181205084859.gif
2.實現方式
1.之前把融雲的API文件全看了一遍也沒有提供一個介面供使用。正當我一籌莫展的時候發現了這個-ConversationFragment。我們通過這個物件可以拿到聊天列表的adapter。
/** * 載入會話頁面 ConversationFragment * * @param mConversationType 會話型別 * @param mTargetId目標 Id */ ConversationFragment mFragment = (ConversationFragment) getSupportFragmentManager().findFragmentById(R.id.conversation); Uri uri = Uri.parse("rong://" + getApplicationInfo().packageName).buildUpon() .appendPath("conversation").appendPath(mConversationType.getName().toLowerCase()) .appendQueryParameter("targetId", mTargetId).build(); mFragment.setUri(uri);
2.先別急,這裡肯定要在長按點選事件的時候判斷當前message是不是TextMessage,這樣便於取出文字資訊進行翻譯。
//判斷是否為文字訊息 if (content instanceof TextMessage) { mContent = ((TextMessage) content).getContent(); //我這裡是開了一個執行緒,呼叫的是百度翻譯API,你這裡可以根據自己的方式來來到翻譯結果 Thread thread = new Thread(new Runnable() { @Override public void run() { String transResult = mTransApi.getTransResult(mContent, "auto", "en"); Log.e("翻譯結果", transResult); mResultBean = JsonUtils.GsonToBean(transResult, ResultBean.class); mResult = mResultBean.trans_result.get(0).dst; } }); try { thread.join(); } catch (InterruptedException e) { } thread.start();
3.獲取adapter。
MessageListAdapter messageAdapter = mFragment.getMessageAdapter();
4.這個時候又出現問題了,這個adapter拿不到當前聊天頁面的list,可能是融雲沒有公開,也可能是我沒有細心找。這樣的話可能就拿不到當前的position,也就無法替換原文字內容了。我開始debug,看看到底能夠拿到什麼。後來終於被我發現這個方法。
//可以通過當前message的傳送時間獲取當前message的位置 int positionBySendTime = messageAdapter.getPositionBySendTime(message.getSentTime()); //通過該位置拿到list裡面當前的item,這裡需要注意位置需要減1,因為這個方法拿到的位置是從1開始的 UIMessage item = messageAdapter.getItem(positionBySendTime - 1); //替換當前item的文字,mResult是翻譯結果 item.setTextMessageContent(SpannableStringBuilder.valueOf(mResult)); //重新整理adapter,就搞定了 messageAdapter.notifyDataSetChanged();
3.IOS也可以實現上述結果,但是方式略有不同,我問了同事,IOS是直接可以拿到當前position直接替換model,然後reload一下就行了。