本文教大家通过三步集成流程,在环信 Android UIKit 基础上 实现仿微信风格的多图选择与批量发送功能。该功能支持用户在聊天界面点击扩展菜单后,一次性从相册选择最多9张图片,并批量发送到聊天会话中。

在这里插入图片描述

实现方案概述

  • 多图选择库:采用 PictureSelector 3.x,支持所有 Android 版本的多图选择、预览、压缩等。

  • 图片加载引擎:采用 Glide 作为图片加载引擎,配合自定义 GlideEngine 实现高效图片预览。

  • 兼容性:支持 Android 5.0 及以上,兼容主流 ROM。

  • 环信 UIKIt 源码:下载

主要依赖

在 app/build.gradle 中添加:

implementation 'io.github.lucksiege:pictureselector:v3.11.2'implementation 'com.github.bumptech.glide:glide:4.16.0'kapt 'com.github.bumptech.glide:compiler:4.16.0'

关键代码讲解

1. GlideEngine 实现

app/src/main/kotlin/com/hyphenate/chatdemo/utils/GlideEngine.kt

class GlideEngine : ImageEngine {
    override fun loadImage(context: Context, url: String, imageView: ImageView) {
        Glide.with(context).load(url).into(imageView)
    }
    override fun loadImage(context: Context?, imageView: ImageView?, url: String?, width: Int, height: Int) {
        if (context != null && imageView != null && url != null) {
            Glide.with(context).load(url).override(width, height).into(imageView)
        }
    }
    override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) {
        Glide.with(context).load(url).apply(RequestOptions().centerCrop()).into(imageView)
    }
    override fun loadGridImage(context: Context, url: String, imageView: ImageView) {
        Glide.with(context).load(url).apply(RequestOptions().centerCrop()).into(imageView)
    }
    override fun pauseRequests(context: Context) {
        Glide.with(context).pauseRequests()
    }
    override fun resumeRequests(context: Context) {
        Glide.with(context).resumeRequests()
    }
    companion object {
        private var instance: GlideEngine? = null
        fun createGlideEngine(): GlideEngine {
            if (instance == null) {
                instance = GlideEngine()
            }
            return instance!!
        }
    }}

2. ChatFragment 多图选择与发送

app/src/main/kotlin/com/hyphenate/chatdemo/ui/chat/ChatFragment.kt

PictureSelector.create(this)
    .openGallery(1) // 1 代表图片类型
    .setMaxSelectNum(9)
    .isPreviewImage(true)
    .setImageEngine(GlideEngine.createGlideEngine())
    .forResult(object : OnResultCallbackListener<LocalMedia> {
        override fun onResult(result: ArrayList<LocalMedia>?) {
            result?.forEach { media ->
                val path = media.availablePath                if (!path.isNullOrEmpty()) {
                    val uri = Uri.parse(path)
                    sendImage(uri)
                }
            }
        }
        override fun onCancel() {}
    })

3. 发送图片消息

sendImage(uri: Uri) 方法内部调用环信 SDK 的图片消息发送能力,通常直接调用父类或 SDK 提供的 sendImageMessage(uri)

通过以上三步集成,大家可以在环信 Android UIKit 基础上实现完善的仿微信多图选择与发送功能。在实际项目中,还可根据具体需求调整选择数量限制、UI风格和发送策略等。

常见问题与解决方案

1. 报错:

imageEngine is null, Please implement ImageEngine

解决:需实现并设置图片加载引擎(如 GlideEngine),并在 PictureSelector 调用链加 .setImageEngine(GlideEngine.createGlideEngine())

2. 报错:

NotImplementedError: An operation is not implemented: Not yet
implemented

解决:需实现 GlideEngine 的所有接口方法,尤其是 loadImagepauseRequestsresumeRequests 等。

3. 报错:

Type mismatch: inferred type is String but Int was expected

解决:openGallery 需传入 Int 类型(如 1 或 PictureMimeType.ofImage()),不能传字符串。

4. 低版本 Android 不能多选?

PictureSelector 兼容所有主流 Android 版本,部分国产 ROM 需授权存储权限。

相关文档:注册环信