本文教大家通过三步集成流程,在环信 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 的所有接口方法,尤其是 loadImage、pauseRequests、resumeRequests 等。
3. 报错:
Type mismatch: inferred type is String but Int was expected
解决:openGallery 需传入 Int 类型(如 1 或 PictureMimeType.ofImage()),不能传字符串。
4. 低版本 Android 不能多选?
PictureSelector 兼容所有主流 Android 版本,部分国产 ROM 需授权存储权限。
相关文档:注册环信