SDK 接入说明
0.获取必要的接入信息
开发者将应用与SDK进行对接时,必要接入信息如下:
appId
- 应用的App IDappSecret
- 应用的App Secret
如您暂未获得以上接入信息,可以在此申请
1. 下载与导入
下载SDK最新版本,解压后会得到BQMM_Lib文件夹。
将该文件夹拷贝入待导入的项目目录,然后在settings.gradle中添加:
include ':BQMM_Lib'
同步Gradle之后,BQMM_Lib就成为了项目的一个模块,可以作为依赖添加到需要用到它的模块中去了。
2. 注册 Activity
在AndroidManifest.xml文件中,添加Activity
和权限的声明。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.INTERNET" />
<activity
android:name="com.melink.bqmmsdk.ui.store.EmojiPackageList"
android:screenOrientation="portrait" />
<activity
android:name="com.melink.bqmmsdk.ui.store.EmojiPackageDetail"
android:screenOrientation="portrait" />
<activity
android:name="com.melink.bqmmsdk.ui.store.EmojiPackageSetting"
android:screenOrientation="portrait" />
<activity
android:name="com.melink.bqmmsdk.ui.store.EmojiDetail"
android:screenOrientation="portrait" />
<activity
android:name="com.melink.bqmmsdk.ui.store.ServiceDeclaration"
android:screenOrientation="portrait" />
<activity
android:name="com.melink.bqmmsdk.ui.store.EmojiPackageSort"
android:screenOrientation="portrait" />
<activity
android:name="com.melink.bqmmsdk.ui.store.AuthorDetail"
android:screenOrientation="portrait" />
3. 获得SDK实例对象
BQMM实例对象使用单例实现,通过静态方法BQMM.getInstance()
获得。
4. 初始化SDK
初始化SDK时,需要设置从官网申请到的AppId和AppSecret。
BQMM bqmmsdk = BQMM.getInstance();
bqmmsdk.initConfig(context, YOUR_APP_ID, YOUR_APP_SECRET);
5. 添加BQMM键盘
SDK提供BQMMKeyboard
类实现表情键盘。 使用时在布局文件中加入该控件即可。
<!-- 集成BQMM表情键盘 -->
<com.melink.bqmmsdk.ui.keyboard.BQMMKeyboard
android:id="@+id/bqmm_keyboard"
android:layout_width="match_parent"
android:layout_height="250dp"/>
添加发送按钮BQMMSendButton
。
<com.melink.bqmmsdk.widget.BQMMSendButton
android:id="@+id/btn_send"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_send"/>
添加消息编辑控件BQMMEditView
。
<com.melink.bqmmsdk.widget.BQMMEditView
android:id="@+id/et_sendmessage"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
在相应Activity
中初始化,并在SDK实例上注册。
bqmmsdk = BQMM.getInstance();
bqmmKeyboard = (BQMMKeyboard) findViewById(R.id.bqmm_keyboard);
bqmmSendButton = (BQMMSendButton) findViewById(R.id.btn_send);
bqmmEditText = (BQMMEditView) findViewById(R.id.et_sendmessage);
bqmmsdk.setEditView(bqmmEditText);
bqmm.setKeyboard(bqmmKeyboard, new IGifButtonClickListener() {
@Override
public void didClickGifTab() {
//在这里实现打开搜索弹窗的逻辑。参见“10. 实现Gif搜索功能”
}
});
bqmmsdk.setSendButton(bqmmSendButton);
bqmmsdk.load();
6. 实现表情键盘和软键盘切换按钮
BQMMKeyboard提供了BQMMKeyboard.showKeyboard()
、BQMMKeyboard. hideKeyboard()
和BQMMKeyboard.isKeyboardVisible()
这三个方法帮助开发者快捷地实现表情键盘的显示、隐藏、检查开启状态三种操作。
开发者也可以不采用以上方法,而是通过设置键盘这个View的visibility来实现打开和收起键盘的操作。
7. 发送表情消息
SDK定义了IBqmmSendMessageListener
接口作为消息发送的回调,此接口含有两个方法:
void onSendMixedMessage(List emojis, boolean isMixedMessage)
发送整条消息。当用户点击表情键盘中的一个表情时,如果该表情没有直接上屏,就会进入编辑框等待用户编辑发送。在用户点击了“发送”按钮时,编辑框中的整条消息就会被SDK转换成字符串和Emoji对象的混合List并传给这个方法。
该方法的第一个参数
emojis
就是消息的全部内容。这个List
由编辑框中的消息拆分而成,其中的每一个对象可能是String(普通字符、小表情)或者Emoji(大表情)。List中内容的顺序与拆分之前消息中的顺序一致。第二个参数
isMixedMessage
代表着第一个参数传入的List中是否包含Emoji对象。一条消息中不含Emoji对象意味着它可以作为纯文本处理,一些开发者可能会考虑采用一些特殊的方法来对它们进行发送/保存/处理。为了帮助开发者免去遍历List的麻烦,我们额外提供了这一参数。需要注意的是,当前版本中的小表情都是Unicode字符,当消息中只含有普通文字和小表情时,isMixedMessage为false。void onSendEmoji(Emoji face)
发送单个表情。当SDK为IM模式时,如果用户点击了表情键盘中的大表情,这个接口会被直接调用。它唯一的参数
face
代表被发送的表情。
以下代码是该接口的一个使用示例。
bqmmsdk.setBqmmSendMsgListener(new IBqmmSendMessageListener() {
/**
* 点击发送单个大表情的回调
*/
@Override
public void onSendEmoji(Emoji face) {
//表情消息发送
sendFaceText(face.getEmoCode() ,FACETYPE);
}
/**
* 从BQMMEditView中发送图文混排表情的回调方法
*/
@Override
public void onSendMixedMessage(List<Object> emojis, bool isMixedMessage) {
//将emojis转换为可发送的消息字符串
String msgString = getMixedMessageString(emojis);
if(isMixedMessage){
//图文混排表情消息发送
sendMixedText(msgString, EMOJITYPE);
}else{
//纯文本消息
sendText(msgString);
}
}
});
8. 封装表情消息
封装消息,指的是把消息从发送回调中的原始格式转换为便于传输/存储的格式这一过程。SDK默认提供了一种基于JSON的标准封装格式。下面举一个简单的栗子:
在编辑框中输入了如下消息:
你好,。我是Annie
点击发送按钮之后,在onSendMixedMessage
回调方法中,会得到如下列表:
["你好,", Emoji对象, "。我是Annie", Emoji对象, Emoji对象]
利用BQMMMessageHelper.getMixedMessageData(List<Object> content)
方法,可以将它转换为这样的JSONArray:
[["你好,", 0], ["haha", 1], ["。我是Annie", 0], ["biyan", 1], ["biyan", 1]]
对标准封装格式的定义如下:
标准封装格式的最外层是一个含有任意数量元素的JSONArray,其中的每一个元素则是含有两个元素的JSONArray,后者的第一个元素是字符串,第二个元素是整数。这里的字符串被称为“内容”,整数被称为“类型”,类型决定了内容应该被如何理解和展示,目前的类型共三种:
0: 纯文本,内容会被作为文本直接显示出来。
1: 小表情,内容会被理解为表情代码,显示为较小的图片。
2: 大表情,内容会被理解为表情代码,显示为较大的图片。
BQMMMessageHelper
提供了两个封装消息的方法,分别对应onSendMixedMessage
和onSendFace
收到的参数:
BQMMMessageHelper.getMixedMessageData(List<Object> content)
BQMMMessageHelper.getFaceMessageData(Emoji face)
9. 消息显示
SDK1.6版本移除了
BQMMMessageView
控件,以BQMMMessageText
作为默认支持的消息展示控件
BQMMMessageText
继承于原生TextView
,兼容大表情展示和混排gif表情展示。
调用如下方法可以实现消息的显示:
/**
* @param msgTextString 消息的纯文本表达
* @param msgType 消息的类型,EMOJITYPE代表混排表情消息,FACETYPE代表单表情消息
* @param msgData 消息的JSONArray格式
*/
public void showMessage(String msgTextString, String msgType, JSONArray msgData) {
}
msgTextString
这一参数可能不太好理解,既然msgData
是含有消息全部信息的JSONArray,这个msgTextString又有什么用处呢?它的作用实际上比较类似于HTML中<img>
标签的"alt"属性,起到辅助说明内容的作用,当富媒体内容无法展示时也可以代替该内容的位置。以微信为例,在聊天界面中表情以图片显示,而在会话列表界面中则以形如[哈哈]这样的字符形式显示。
对于FACETYPE和EMOJITYPE这两种消息类型,BQMM在以上函数的基础上分别封装了两个较为简单的函数给开发者调用。开发者只需要传入JSONArray形式的消息内容,BQMM会自动生成对应的msgTextString。
显示大表情消息:
/**
* 将消息作为单个大表情消息展示
*
* @param data 以标准格式封装的消息数据
*/
public void showSticker(JSONArray data) {
}
显示混合消息:
/**
* 将消息作为普通含表情消息展示
*
* @param data 以标准格式封装的消息数据
*/
public void showMessage(JSONArray data) {
}
以下函数可以设置大表情的显示大小:
/**
* 设置控件中展示大表情的尺寸大小
*
* @param size 单位为像素,大表情将被显示为size×size大小
*/
public void setStickerSize(int size) {
}
小表情的大小是根据字体大小决定的,目前不可以单独设置。
10. 实现Gif搜索功能
BQMM类中提供了三个接口,可以用于实现Gif搜索功能。
- 流行gif数据接口
/**
* 异步返回流行gif结果
* @param page 页码
* @param pageSize 一页的数量
* @param callback 用于接收trending结果的回调
*/
trendingGifsAt(int page, int pageSize, IBQMMGifCallback<BQMMGif> callback)
- 搜索gif数据接口
/**
* 异步返回搜索结果
* @param text 搜索关键词
* @param page 页码
* @param pageSize 一页的数量
* @param callback 用于接收搜索结果的回调
*/
searchGifsWithKey(String text, int page, int pageSize, IBQMMGifCallback<BQMMGif> callback)
- 清空gif缓存接口
/**
* @param isClearAll 为true清空全部gif缓存,false清空最近访问的100个gif之外的缓存。
*/
clearBQMMGifCache(boolean isClearAll)
我们在各个demo里都加了对应的bqmmgif包,包含3个类和1个接口。
分别为 BQMMGifManager,BQMMSearchContentAdapter,BQMMSearchPopupWindow及IBqmmSendGifListener。
- BQMMGifManager用来管理搜索和展示gif及关闭gif弹窗的时机。
- BQMMSearchPopupWindow就是gif弹窗。
- BQMMSearchContentAdapter就是展示gif的适配器。
- IBqmmSendGifListener为发送gif的回调接口。
以上3个类都可以根据自己项目的实际需求来调整。
11. UI定制
可定制范围:
- 键盘上商店按钮的颜色和背景颜色
- 键盘背景色
- 键盘上发送按钮的字体和背景颜色
- 小表情键盘上的删除图标
- 键盘加载失败的文字提示和按钮样式
- 商店导航栏标题字体
- 商店导航栏背景色
- 商店导航栏返回图标和设置图标
- 下载按钮字体、颜色,以及背景色
- 商店加载失败的文字提示和按钮样式
开发者可以在BQMM_Lib
项目的res
文件夹下修改以上配置。
12. 配置Proguard
如果项目使用了proguard做混淆,需要加入以下配置保证BQMM的正常运行:
-dontwarn com.melink.**
-keep class com.melink.** {*;}
如果混淆后的APK安装运行时报了BQMM相关UI初始化错误,可以尝试增加如下配置:
-keep class **.R
-keep class **.R$* {
<fields>;
}
13. 设置接入方App UserId(可选)
对App内单个用户的表情使用情况,可以在初始化SDK后设置App的UserId,方便跟踪统计。
public void setAppUserID(String appUserID)