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.有问题随时沟通。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 14,540评论 2 59
  • 在那些气若游丝的生命面前 逻辑思维终于败下阵来 死神冷笑 鄙视无能的科学 我也冷笑 死神愕然止步 原来那...
    可有可无9527阅读 3,034评论 2 2
  • 想不到吧,这是一棵有着三十年岁龄的杨桃树,开着小小的紫花,可是长出来的杨桃却比叶子还要大几倍,紫花的花瓣从花心部位...
    手绘者焕新阅读 4,012评论 5 10

友情链接更多精彩内容