OpenIM 服务器部署 + 安卓端集成全指南:从搭建到实现音视频通话

Source

以下是 OpenIM 服务器部署及安卓端集成使用的详细文档,帮助你快速搭建服务并在安卓应用中集成即时通讯及音视频功能。

一、OpenIM 服务器部署(Docker 方式,推荐)

1. 环境准备
  • 服务器要求:Linux 系统(Ubuntu 20.04+/CentOS 7+),2 核 4G 以上配置,公网 IP(音视频功能需要)。
  • 安装依赖

    bash

    # 安装 Docker
    curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
    # 安装 Docker Compose
    apt-get install docker-compose-plugin  # Ubuntu/Debian
    # 或 CentOS: yum install docker-compose-plugin
    
  • 开放端口
    需在服务器防火墙和云厂商安全组中开放以下端口:
    • 10001-10010(IM 核心服务)
    • 20000-20010(音视频媒体服务)
    • 8080(管理后台)
2. 部署步骤

bash

# 1. 克隆代码仓库
git clone https://github.com/OpenIMSDK/Open-IM-Server.git
cd Open-IM-Server

# 2. 配置环境变量-- 目录下好像没这个文件,就先跳过不设置, 应该直接写在docker compose中了 
cp config/config.yaml.example config/config.yaml
# 编辑配置文件,修改关键参数
vim config/config.yaml

关键配置项(必改):

  • ip:填写服务器公网 IP(如 1.2.3.4
  • api_port:默认 10002(API 接口端口)
  • ws_port:默认 10001(WebSocket 端口)
  • 其他参数保持默认即可(首次部署)。
打开管理后台配置---修改docker-compose.yml配置文件

bash

# 3. 启动服务
docker-compose up -d

# 4. 检查服务状态(所有服务状态为 Up 则成功)
docker-compose ps

等待安装完成

安装完成

3. 验证部署
  • 访问管理后台:http://服务器IP:11002,默认账号密码 admin/admin
  • 若能登录,则服务器部署成功。

登录页面

出现问题

会出现输入用户名和密码之后点击没反应,不能登录的问题 , 原因是openim-api服务没启动

解决办法 

需要下载下面的仓库 

git clone https://gh-proxy.com/https://github.com/openimsdk/openim-docker.git E:\OpenIM\openim-docker 

拷贝到代码仓库下 

copy E:\OpenIM\openim-docker\docker-compose.yaml E:\OpenIM\Open-IM-Server\docker-compose.yml 
copy E:\OpenIM\openim-docker\.env E:\OpenIM\Open-IM-Server\.env 

重新启动 

docker-compose up -d 

等待启动成功

出现问题 

解决办法 

安装go环境

官网

https://golang.google.cn/dl/

下载对应的版本

双击安装 ,等待安装完成 

打开新终端,确认能执行go命令

执行命令

cd E:\OpenIM\Open-IM-Server\tools\imctl
go run main.go user register -u admin -p admin -n admin

二、安卓端集成 OpenIM SDK

1. 环境准备
  • Android Studio 4.0+
  • 安卓项目最低支持 API 21(Android 5.0)
  • 依赖配置:在 build.gradle 中添加仓库和依赖。
2. 集成步骤
(1)添加依赖

在项目根目录的 build.gradle 中添加 Maven 仓库:

gradle

allprojects {
    repositories {
        // ... 其他仓库
        maven { url "https://jitpack.io" }
        maven { url "https://maven.aliyun.com/repository/public" }
    }
}

在 app 模块的 build.gradle 中添加 SDK 依赖:

gradle

dependencies {
    // OpenIM 核心 SDK(最新版本可查看官方仓库)
    implementation 'io.openim:core-sdk:2.3.0'
    // 音视频依赖(如需音视频通话)
    implementation 'io.openim:av-sdk:2.3.0'
}
(2)初始化 SDK

在 Application 类中初始化 SDK(全局只需要初始化一次):

java

运行

import io.openim.android.sdk.OpenIMClient;
import io.openim.android.sdk.listener.OnConnectListener;

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        
        // 初始化配置
        OpenIMClient.getInstance().init(
            this,
            "http://服务器IP:10002",  // API 地址(服务器公网IP+10002端口)
            "ws://服务器IP:10001",   // WebSocket 地址(服务器公网IP+10001端口)
            new OnConnectListener() {
                @Override
                public void onConnecting() {
                    // 连接中
                }
                @Override
                public void onConnectSuccess() {
                    // 连接成功
                }
                @Override
                public void onConnectFailed(int code, String error) {
                    // 连接失败
                }
            }
        );
    }
}
(3)用户登录

需先通过服务器接口创建用户(可在管理后台手动创建测试用户),获取 userID 和 token 后登录:

java

运行

import io.openim.android.sdk.OpenIMClient;
import io.openim.android.sdk.listener.OnBaseListener;

// 登录
OpenIMClient.getInstance().login(
    "userID",  // 用户名(如 test123)
    "token",   // 用户令牌(从服务器获取)
    new OnBaseListener<String>() {
        @Override
        public void onSuccess(String data) {
            // 登录成功
        }
        @Override
        public void onError(int code, String error) {
            // 登录失败
        }
    }
);

三、安卓端实现核心功能

1. 基础聊天(文字消息)

java

运行

import io.openim.android.sdk.models.Message;
import io.openim.android.sdk.enums.MsgType;

// 发送文字消息给指定用户
String receiverID = "对方userID"; // 接收方用户ID
String content = "你好,这是一条测试消息";

OpenIMClient.getInstance().messageManager.sendSingleMessage(
    receiverID,
    content,
    MsgType.TEXT,
    new OnBaseListener<Message>() {
        @Override
        public void onSuccess(Message message) {
            // 消息发送成功
        }
        @Override
        public void onError(int code, String error) {
            // 发送失败
        }
    }
);

// 监听新消息
OpenIMClient.getInstance().messageManager.addAdvancedMsgListener(
    new OnAdvancedMsgListener() {
        @Override
        public void onRecvNewMessage(Message message) {
            // 收到新消息,更新UI
        }
    }
);
2. 语音 / 视频通话

java

运行

import io.openim.android.sdk.OpenIMClient;
import io.openim.android.sdk.enums.CallType;

// 发起视频通话(1:语音,2:视频)
String targetUserID = "对方userID";
OpenIMClient.getInstance().callManager.startCall(
    targetUserID,
    CallType.VIDEO, // 视频通话
    new OnBaseListener<String>() {
        @Override
        public void onSuccess(String callID) {
            // 通话请求已发送
        }
        @Override
        public void onError(int code, String error) {
            // 发起失败
        }
    }
);

// 监听来电
OpenIMClient.getInstance().callManager.setCallListener(
    new OnCallListener() {
        @Override
        public void onCallReceived(String callID, String callerID, int callType) {
            // 收到来电,显示通话界面
            // 接听通话
            OpenIMClient.getInstance().callManager.acceptCall(callID);
        }
        @Override
        public void onCallEnded(String callID, int reason) {
            // 通话结束
        }
    }
);

// 挂断通话
OpenIMClient.getInstance().callManager.endCall(callID);
3. 自定义通话 UI

OpenIM 音视频通话的 UI 完全由开发者自定义,核心步骤:

  1. 创建通话界面布局(activity_call.xml),包含视频容器、静音按钮、挂断按钮等。
  2. 在通话开始时,通过 SDK 接口获取本地 / 远程视频流,绑定到 SurfaceView 或 TextureView

    java

    运行

    // 获取本地视频流并显示
    SurfaceView localView = findViewById(R.id.local_video);
    OpenIMClient.getInstance().callManager.setLocalVideoView(localView);
    
    // 获取远程视频流并显示
    SurfaceView remoteView = findViewById(R.id.remote_video);
    OpenIMClient.getInstance().callManager.setRemoteVideoView(remoteUserID, remoteView);
    
  3. 绑定按钮事件(静音、切换摄像头等):

    java

    运行

    // 静音
    findViewById(R.id.btn_mute).setOnClickListener(v -> {
        OpenIMClient.getInstance().callManager.setMute(true);
    });
    // 切换摄像头
    findViewById(R.id.btn_switch_camera).setOnClickListener(v -> {
        OpenIMClient.getInstance().callManager.switchCamera();
    });
    

四、常见问题

  1. 音视频通话失败

    • 检查服务器公网 IP 是否正确配置,端口是否开放。
    • 确保客户端网络能访问服务器的 20000-20010 端口。
    • 安卓 9.0+ 需在 AndroidManifest.xml 中添加 android:usesCleartextTraffic="true"(或配置 HTTPS)。
  2. 消息发送失败

    • 检查 apiAddr 和 wsAddr 是否正确(IP + 端口是否可达)。
    • 确认 userID 和 token 有效(可在管理后台重置 token)。
  3. 依赖冲突

    • 若出现 duplicate class 错误,在 app/build.gradle 中排除冲突依赖:

      gradle

      implementation ('io.openim:core-sdk:2.3.0') {
          exclude group: 'com.google.code.gson'
      }
      

五、参考文档

按照以上步骤,即可完成 OpenIM 服务器部署和安卓端集成,实现即时通讯及音视频通话功能,并根据需求自定义 UI 界面。