转载自融云 Android SDK 2.8.0+ Extension 开发文档

融云 SDK 2.8.0 后对 会话界面输入区域、+号扩展区域、语音消息、Emoji 等进行了优化和重构,重构后上列区域有个统一的名称: Extension。本篇文档将会对 Extension 的概念,用法,自定义进行逐一讲解。

概念

见上图 Extension 即是整个标识了红框的区域,默认包含如下:

  • Text 文字输入区域

  • Voice 语音消息区域(按住说话)

  • Plugin 功能插件扩展区域 (相册,位置,音视频等)

  • Emoji 表情区域 (包含 EmoticonTabs 扩展区域)

自定义

Extension 目前提供了两种自定义方式 :

1 自定义增加扩展区域功能插件 PluginModules

上图红色 TODO 红框区域即是可供开发者自定义新功能插件,目前包含可功能自定义,以及对功能插件的自定义排序。另外功能插件的展示也可根据不同的会话类型来调整。

2 自定义 EmoticonTabs 扩展区域

此处可供开发者自定义扩展

SDK 提供的表情扩展如下图

用法
RongExtension

输入区域扩展栏接口类为 RongExtension。

  1. 目前 IMKit 中已经在布局文件中 rc_fr_conversation.xml 默认添加了 RongExtension 模块。

  2. 开发者只需要继承 ConversationFragment, 在 onCreateView 通过 view.findViewById() 找到 RongExtension 模块即可。

  3. 还可以通过 ConversationFragment 访问到 RongExtension 中各个组件被点击的事件,及内部 EditText 文本变化等方法。

RCStyle SDK提供了 5 种供开发者调整的样式(默认为 SCE):

SCE:语音/文本切换功能+内容输入功能+扩展功能

SC:语音/文本切换功能+内容输入功能

EC:扩展功能+内容输入功能

CE:内容输入功能+扩展功能

C:内容输入功能

以上的 5 种组合开发者可在 rc_fr_conversation.xml 里 app:RCStyle="SCE" ,更改默认输入显示形式。也可动态调用 RongExtension 提供的方法代码设置。

/*** 设置 ExtensionBar 样式.** @param style 目前支持 5 种样式,参照: {@link io.rong.imkit.InputBar.Style}*/
public void setInputBarStyle(InputBar.Style style) {switch (style) {case STYLE_SWITCH_CONTAINER_EXTENSION:setSCE();break;case STYLE_CONTAINER:setC();break;case STYLE_CONTAINER_EXTENSION:setCE();break;case STYLE_EXTENSION_CONTAINER:setEC();break;case STYLE_SWITCH_CONTAINER:setSC();break;}
}

设置客服的输入模式:

/*** 设置 ExtensionBar 客服输入模式** @param mode 输入模式, 参照: {@link CustomServiceMode}*/
public void setExtensionBarMode(CustomServiceMode mode)
InpuBar.java 中有对 5 种组合 以及 客服 的枚举注释。public class InputBar {public enum Style {/*** 录音切换-输入框-扩展*/STYLE_SWITCH_CONTAINER_EXTENSION(0x123),/*** 录音切换-输入框*/STYLE_SWITCH_CONTAINER(0x120),/*** 输入框-扩展*/STYLE_CONTAINER_EXTENSION(0x023),/*** 扩展-输入框*/STYLE_EXTENSION_CONTAINER(0x320),/*** 仅有输入框*/STYLE_CONTAINER(0x020);int v;Style(int v) {this.v = v;}public static Style getStyle(int v) {Style result = null;for (Style style : values()) {if (style.v == v) {result = style;break;}}return result;}}public enum Type {/*** 默认输入模式*/TYPE_DEFAULT,/*** 客服输入模式:仅机器人*/TYPE_CS_ROBOT,/*** 客服输入模式:仅机人工*/TYPE_CS_HUMAN,/*** 客服智能输入模式:机器人优先*/TYPE_CS_ROBOT_FIRST,/*** 客服智能输入模式:人工优先*/TYPE_CS_HUMAN_FIRST}
}
public class TestFragment extends ConversationFragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {View view = super.onCreateView(inflater, container, savedInstanceState);mRongExtension = (RongExtension) view.findViewById(R.id.input_board);return view;}/*** 点击 “+” 号区域, 回调中携带 ViewGroup** @param v              “+” 号 view 实例* @param extensionBoard 用于展示 plugin 的 ViewGroup*/@Overridepublic void onPluginToggleClick(View v, ViewGroup extensionBoard) {super.onPluginToggleClick(v, extensionBoard);}@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {super.beforeTextChanged(s, start, count, after);}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {super.onTextChanged(s, start, before, count);}}
替换输入框背景、图片

1 rc_ext_extension_bar.xml 输入框布局文件,是整个输入框的容器,xml 内有对各部分组件的注释描述。

2 输入框的 EditText 的布局文件是 rc_ext_input_edit_text.xml , 可通过此文件替换你需要的背景。

3 语音输入的布局文件是 rc_ext_voice_input.xml

默认扩展功能插件区域 Plugins

注意:下列功能插件需要展示用户头像和昵称的均需开发者对用户信息做实现。

1 相册已经封装到了 IMKit 里面 ImagePlugin.java ,包含发送图片以及拍照发送的功能。

2 文件已经封装到 IMKit 里面 FilePlugin.java。

3 位置功能 内置了已经实现了基于高德地图的 发送当前位置 以及 位置共享 功能,如果开发者有其他厂商地图的需求,需要自定义 Plugin。如果开发者需要使用默认实现好了的地理位置的功能,只需要将 高德地图(融云官网 Android SDK 内下载) 的三个 jar 添加至 IMKlit Module Libs 目录下即可。

  • DefaultLocationPlugin.java 地理位置

  • RealTimeLocationPlugin.java 位置共享

  • CombineLocationPlugin.java 地理位置 和 位置共享的功能聚合

4 音频、视频两个功能插件需要依赖 CallKit 、CallLib 两个 Module,Module 官网 Android SDK 提供下载。需要注意的是使用音视频功能需要在官网开发者账号中开通相关服务,开通后生效时间为 1 个自然日。 依赖配置可参考官网 SealTalk。

5 红包功能需要在官网 Android sdk 中获取 RedPacket Module ,将其依赖至你的主工程下,另外红包提供接口, 进入"我的钱包" :

/*** 进入我的钱包页面* @param activity :从哪个activity的跳转*/
JrmfClient.intentWallet(Activity activity);

目前红包功能仅支持 Private、Group 两种会话类型。

6 语音输入功能基于科大讯飞。需要从 SealTalk 中获取 Recognizer Module

上述 7 个功能插件。代码部分已经由 SDK 完成,开发者只需添加 Jar 和 Module 就能开箱即用。

自定义
一 、DefaultExtensionModule

SDK 中默认提供了一套+号扩展插件功能区域的类,即 DefaultExtensionModule,即便你不做任何代码的编写都会自动适配这套 DefaultExtensionModule 下包含的 Plugin 以及 EmoticonTab。

二、注册 和 去重

如果需要自定义功能插件

RongExtensionManager.getInstance().registerExtensionModule(new SampleExtensionModule());

注册上面代码的需要在 RongIM.init 后。我们建议在 Application 的 Context 中进行注册,此时是最佳注册时机。

需要注意的是要对 DefaultExtensionModule 进行去重不然 Plugins 下的功能可能会出现重复,例如出现两套 图片、文件、音视频的 Plugin。去重示例代码如下:

三 Plugins 和 EmoticonTabs
如果仅仅只是想 自定义 Plugins 或 EmoticonTabs 其中一项,另外一项保持默认跟随 sdk 配置,开发者可自定义继承自 DefaultExtensionModule 的类。重写类中的 getPluginModules 或者 getEmoticonTabs 方法。需要被保留为默认跟随 SDK 配置项的即调用 super 其父类中的方法即可。如果 Plugins 或 EmoticonTabs 两项需要全部自定义则可直接实现 IExtensionModule。

四 自定义 Plugin 和 Plugins 排序

示例的插件模块代码需要自定义类继承 IPluginModule :

public class SamplePlugin implements IPluginModule {Conversation.ConversationType conversationType;String targetId;@Overridepublic Drawable obtainDrawable(Context context) {//设置插件 Plugin 图标return ContextCompat.getDrawable(context, R.drawable.rc_ext_plugin_image_selector);}@Overridepublic String obtainTitle(Context context) {//设置插件 Plugin 展示文字return "示例";}@Overridepublic void onClick(final Fragment currentFragment, RongExtension extension) {//示例获取 会话类型、targetId、Context,此处可根据产品需求自定义逻辑,如:开启新的 Activity 等。conversationType = extension.getConversationType();targetId = extension.getTargetId();Message message = Message.obtain(targetId, conversationType, TextMessage.obtain("示例插件功能"));RongIM.getInstance().sendMessage(message, null, null, new IRongCallback.ISendMessageCallback() {@Overridepublic void onAttached(Message message) {}@Overridepublic void onSuccess(Message message) {Toast.makeText(currentFragment.getActivity(), "消息发送成功, 示例获取 Context", Toast.LENGTH_SHORT).show();}@Overridepublic void onError(Message message, RongIMClient.ErrorCode errorCode) {}});}@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data) {}
}

调用 SamplePlugin :

public class SampleExtensionModule extends DefaultExtensionModule {@Overridepublic List<IPluginModule> getPluginModules(Conversation.ConversationType conversationType) {
//        super.getPluginModules(conversationType);  如果需要对红包进行排序可从父类中的 getPluginModules 集合中过滤取出 JrmfExtensionModuleList<IPluginModule> pluginModuleList = new ArrayList<>();pluginModuleList.add(new SamplePlugin());return pluginModuleList;}@Overridepublic List<IEmoticonTab> getEmoticonTabs() {return super.getEmoticonTabs();}
}
排序: 决定扩展插件 Plugins 的展示顺序是由你返回集合的顺序决定的。

例如:

@Override
public List<IPluginModule> getPluginModules(Conversation.ConversationType conversationType) {
//        super.getPluginModules(conversationType);  如果需要对红包进行排序可从父类中的 getPluginModules 集合中过滤取出 JrmfExtensionModuleList<IPluginModule> pluginModuleList = new ArrayList<>();pluginModuleList.add(new SamplePlugin());pluginModuleList.add(new LocationPlugin());pluginModuleList.add(new ImagePlugin());// 此时扩展区域的展示顺序应该为 : 示例、位置、图片、红包return pluginModuleList;
}

自定义 Plugins 时例子也可参考 DefaultExtensionModule 中的 getPluginModules 方法。

五、自定义 EmoticonTabs

自定义类实现 IEmoticonTab ,示例代码如下:

public class SampleTab implements IEmoticonTab {@Overridepublic Drawable obtainTabDrawable(Context context) {//展示的图标return context.getResources().getDrawable(R.drawable.rc_tab_emoji);}@Overridepublic View obtainTabPager(Context context) {//初始化 Tab 中的内容, 返回 View 或 View 的子类皆可。还可参考 EmojiTab 中 obtainTabPagerTextView textView = new TextView(context);textView.setText("Sample EmoticonTabs ");return textView;}@Overridepublic void onTableSelected(int position) {}
}

调用:

public class SampleExtensionModule extends DefaultExtensionModule {private EditText mEditText;@Overridepublic List<IPluginModule> getPluginModules(Conversation.ConversationType conversationType) {
//        super.getPluginModules(conversationType);  如果需要对红包进行排序可从父类中的 getPluginModules 集合中过滤取出 JrmfExtensionModuleList<IPluginModule> pluginModuleList = new ArrayList<>();pluginModuleList.add(new SamplePlugin());pluginModuleList.add(new LocationPlugin());pluginModuleList.add(new ImagePlugin());// 此时扩展区域的展示顺序应该为 : 示例、位置、图片、红包return pluginModuleList;}@Overridepublic void onAttachedToExtension(RongExtension extension) {mEditText = extension.getInputEditText();}@Overridepublic void onDetachedFromExtension() {mEditText = null;}@Overridepublic List<IEmoticonTab> getEmoticonTabs() {List<IEmoticonTab> list = new ArrayList<>();EmojiTab emojiTab = new EmojiTab();list.add(emojiTab);list.add(new SampleTab());return list;}
}

排序方式也是按照集合中元素的顺序。

参考资料

  • http://support.rongcloud.cn/kb/NTQ4

  • https://github.com/sealtalk/sealtalk-android

转载于:https://www.cnblogs.com/lmf-techniques/articles/7228222.html

如何使用融云地图,文件等插件--融云 Android SDK 2.8.0+ Extension 开发文档相关推荐

  1. 多传感器融合定位 第四章 点云地图构建及基于点云地图定位

    多传感器融合定位 第四章 点云地图构建及基于点云地图定位 代码下载 https://github.com/kahowang/sensor-fusion-for-localization-and-map ...

  2. Uni-app原生插件基础开发文档

    Uni-app原生插件基础开发文档 一.软件安装 需要Hbuilder和Android Studio,前往官网下载即可 HBuilderX官网下载 Android Studio 官网下载 uni-ap ...

  3. anychat java开发文档_AnyChat视频云平台开发指南

    本帖最后由 佰锐科技-刘冬明 于 2017-9-13 11:59 编辑 简介: AnyChat视频云平台提供线上的音视频通信.多应用接入.即时通讯.全景录像.智能排队,直播.点播等服务.为您定制个性化 ...

  4. 微信小程序开发文档及文件上传示例(JAVA)

    微信小程序开发文档及文档上传示例 一.什么是微信小程序 小程序是一种无需下载安装,即可使用的手机应用.只需要扫描二维码,或是搜一搜,就能立即使用. 与APP不同的是,小程序无需下载安装.无需卸载.用完 ...

  5. c语言如何写gba文件,GBA开发文档.doc

    GBA开发文档 一. GBA开发包--DevKitAdv 简介 DevKitAdv 主要包括两部分,一是GCC++编译器,二是 GBA库. GCC++编译器功能和我们常用的VC差不多,只不过少了个编辑 ...

  6. 云服务器文件打包,如何把云服务器的文件打包出来

    如何把云服务器的文件打包出来 内容精选 换一换 文档数据库服务支持开启公网访问功能,通过弹性IP进行访问.您也可通过弹性云服务器的内网访问文档数据库.要将已有的MongoDB数据库迁移到文档数据库,需 ...

  7. 存储在icloud云盘文件夹顶层_iCloud云盘文件夹共享功能使用方法

    类型:桌面工具大小:37.2M语言:中文 评分:10.0 标签: 立即下载 在我们的苹果手机当中很多人不知道其实我们手机自带有云盘的,就是iCloud云盘文件夹,其中也有个共享的功能,可以和别人互相分 ...

  8. php融云开发文档,融云 - 融云开发文档

    融云 提示 使用融云推送前,必须先集成融云 IMKit/IMLib SDK.可以参考 IMkit SDK 集成指南 或 IMLib SDK 集成指南. 设置应用标识¶ 在 "融云开发者后台 ...

  9. 备份文档到云服务器,文件如何备份到云服务器

    文件如何备份到云服务器 内容精选 换一换 计费项包括存储费和流量费,存储费根据存储库的不同进行收取.详细的计费项目如下所示:存储费:云硬盘备份存储库:备份云硬盘时购买.云服务器备份存储库:备份普通云服 ...

最新文章

  1. 因为名字叫True,她被苹果iCloud服务器拒绝了
  2. Spring-Cloud中的网关
  3. Spring Boot前后端分离项目Session问题解决
  4. tplink软件升级有用吗_TP-LINK路由器升级方法 | 吴文辉博客
  5. 如何在Mac上将您的Apple ID更改为其他电子邮件地址?
  6. ★★停止动画和停止所有动画$(selector).stop() 详解
  7. docker镜像与容器概念
  8. KITTI激光雷达点云解析与图像反投影
  9. 设置控件输入的输入方式
  10. apache基本配置
  11. 【图像加密】基于matlab Logistic混沌图像加密与解密【含Matlab源码 1216期】
  12. windows安装office2016
  13. [转] 香港流行乐坛三十年
  14. php正则国外手机号码,php--最新正则(手机号码)
  15. 微信支付商户平台开通流程
  16. Android APP - GPS定位并获取地理位置
  17. 四步轻松实现用Visio画UML类图
  18. 【Android】缩略图Thumbnails
  19. Parasoft如何满足DISA STIG标准
  20. .NET Framework和.NET Core/.NET5/.NET6

热门文章

  1. cad字体hztxt用什么代替_为什么CAD的字体库相同但打开图纸的效果却不同?
  2. 软件交接需要交接哪些内容_从代理记账公司交接,需要交接哪些财务资料?
  3. spark rdd map java_Spark map 遍历rdd中的每个元素
  4. java中jq转移符,使用StringEscapeUtils对Java中特殊字符进行转义和反转义
  5. Maven本地环境配置(Win10)
  6. rms归一化_【AutoML】归一化(Normalization)方法如何进行自动学习和配置
  7. python︱利用dlib和opencv实现简单换脸、人脸对齐、关键点定位与画图
  8. 图片从预处理到分类的过程
  9. 探测能源、跨洲安全通信……你所想不到的量子技术!
  10. 使用Hystrix实现自动降级与依赖隔离-微服务