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一下就行了。

4.有问题随时沟通。

你可能感兴趣的:(Android实现融云翻译并替换聊天内容)