0.需求
客户采用的是融云第三方聊天,需要实现长按聊天信息翻译并将结果替换原来的文本展示。
1.效果
直接看效果。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();