SDK 接入说明

优质
小牛编辑
132浏览
2023-12-01

0.获取必要的接入信息

开发者将应用与SDK进行对接时,必要接入信息如下:

  • appId - 应用的App ID
  • appSecret - 应用的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提供了两个封装消息的方法,分别对应onSendMixedMessageonSendFace收到的参数:

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搜索功能。

  1. 流行gif数据接口
/**
* 异步返回流行gif结果
* @param page 页码
* @param pageSize 一页的数量
* @param callback 用于接收trending结果的回调
*/
trendingGifsAt(int page, int pageSize, IBQMMGifCallback<BQMMGif> callback)
  1. 搜索gif数据接口
/**
* 异步返回搜索结果
* @param text 搜索关键词
* @param page 页码
* @param pageSize 一页的数量
* @param callback 用于接收搜索结果的回调
*/
searchGifsWithKey(String text, int page, int pageSize, IBQMMGifCallback<BQMMGif> callback)
  1. 清空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)