浏览 SDKs · Android
SDKsAndroid

认证与管理登录会话

使用 OpenIM Android SDK 初始化、登录、查询登录状态、处理连接回调并退出当前账号。

复制

OpenIM Android SDK 使用 initSDK() 初始化本机运行环境,再使用 login() 建立当前用户的登录会话。开始认证前,应先完成开始之前列出的服务、用户和 Token 准备,并按按 Android 环境接入添加依赖和权限。

完整流程如下:

  1. 在应用级会话组件中创建稳定的 OnConnListener
  2. 调用 initSDK() 并确认返回 true
  3. 在登录前设置消息、用户、好友、会话、群组和通话信令 listener。
  4. 从可信后端取得对应的 userID 与 Token,然后调用 login()
  5. 分别等待登录回调成功与 onConnectSuccess(),再开放依赖连接的业务操作。
  6. 主动退出或切换账号时调用 logout(),完成后清理当前账号的应用状态。

下文中的 apiAddrwsAddruserIDtoken 均由可信后端提供。

初始化并处理连接生命周期

Application 生命周期内创建数据目录、初始化 SDK,并传入连接 listener。应用应保存连接状态,但不要在回调中记录 Token 或完整服务凭据。

import android.app.Application;

import java.io.File;

import io.openim.android.sdk.OpenIMClient;
import io.openim.android.sdk.enums.LogLevel;
import io.openim.android.sdk.listener.OnConnListener;
import io.openim.android.sdk.models.InitConfig;

File dataDirectory = new File(application.getFilesDir(), "openim");
if (!dataDirectory.exists() && !dataDirectory.mkdirs()) {
    throw new IllegalStateException("Cannot create the OpenIM data directory.");
}

InitConfig config = new InitConfig(
    apiAddr,
    wsAddr,
    dataDirectory.getAbsolutePath()
);
config.logLevel = LogLevel.Info;
config.isLogStandardOutput = false;

OnConnListener connectionListener = new OnConnListener() {
    @Override
    public void onConnecting() {
        // 连接建立中。
    }

    @Override
    public void onConnectSuccess() {
        // 连接可用后,继续执行依赖连接的操作。
    }

    @Override
    public void onConnectFailed(long code, String error) {
        // 根据 code 和 error 处理连接失败。
    }

    @Override
    public void onKickedOffline() {
        // 清理当前账号状态并提示重新登录。
    }

    @Override
    public void onUserTokenExpired() {
        // 获取新 Token 后重新登录。
    }

    @Override
    public void onUserTokenInvalid(String reason) {
        // 清理当前账号状态并提示重新登录。
    }
};

boolean initialized = OpenIMClient.getInstance().initSDK(
    application,
    config,
    connectionListener
);

if (!initialized) {
    throw new IllegalStateException("OpenIMClientSDK initialization failed.");
}

initSDK() 返回 true 表示 SDK 本地运行环境初始化成功。OnConnListener 的连接回调在调用 login() 后开始反映长连接状态。

字段类型说明
applicationApplication应用级 Context,用于持有 SDK 生命周期。
apiAddrStringOpenIMServer HTTP API 地址。
wsAddrStringOpenIMServer WebSocket 地址。
dataDirectoryFileSDK 数据库和日志使用的应用私有持久化目录。
config.logLevelint使用 LogLevel 常量;正式环境应主动收敛日志级别。
isLogStandardOutputboolean是否把 SDK 日志输出到标准日志流。

SDK 只应在 Application 或应用级会话组件中初始化一次。networkChanged() 用于通知 SDK 重新检查网络;只有在应用已经统一监听系统网络变化时才调用,不能由多个页面重复注册网络回调。

在登录前设置业务 listener

SDK 的 listener 注册方法采用 set 语义,后一次设置会替换前一次设置。应由应用级事件中心创建稳定 listener,再把事件分发给页面状态层。各类 listener 的集中注册、覆盖行为和生命周期见事件概览

SDK 没有公开的 remove/unset 方法。退出或切换账号时,应用事件中心应停止向旧账号页面分发回调,并在下次登录前用新账号对应的完整 listener 组合覆盖设置。

登录当前用户

OpenIMClient.getInstance().login(new OnBase<String>() {
    @Override
    public void onError(int code, String error) {
        // 根据 code 和 error 处理登录失败。
    }

    @Override
    public void onSuccess(String data) {
        // 登录调用完成。
    }
}, userID, token);

login() 的成功回调表示当前登录调用完成;OnConnListener.onConnectSuccess() 表示长连接可用。这两个阶段必须分别处理。不要并发调用 login(),也不要仅凭某一个回调同时推断登录与连接状态。

查询登录状态

int loginStatus = OpenIMClient.getInstance().getLoginStatus();

if (loginStatus == LoginStatus.Logged) {
    String currentUserID = OpenIMClient.getInstance().getLoginUserID();
    // currentUserID 是当前登录用户 ID。
}
状态说明
LoginStatus.LogoutSDK 当前未登录。
LoginStatus.Logging登录正在进行,不应再次发起并行登录。
LoginStatus.LoggedSDK 已登录;网络是否连接仍以 OnConnListener 为准。

getLoginStatus()getLoginUserID() 返回调用时保存在本地 SDK 中的登录状态和用户 ID,不会触发连接回调。切换账号时应先退出旧账号,而不是直接用新参数覆盖当前登录。

处理 Token 和强制下线

收到 onUserTokenExpired()onUserTokenInvalid() 后,应重新向可信后端取得当前用户凭据,再按产品策略重新登录或返回登录页。收到 onKickedOffline() 时,应清理当前用户的会话列表、消息视图、未读数和其他业务状态,不能把它当作用户主动退出。

这些是当前登录账号级别的回调。切换账号前必须停止旧账号的异步任务和页面订阅,并清理旧账号状态。

主动退出与释放 SDK

OpenIMClient.getInstance().logout(new OnBase<String>() {
    @Override
    public void onError(int code, String error) {
        // 根据 code 和 error 处理退出失败。
    }

    @Override
    public void onSuccess(String data) {
        // 登录会话已退出。
    }
});

logout() 成功表示当前 SDK 登录会话已退出。应用状态清理应在成功回调后执行;切换账号时,等待旧账号退出完成后再调用新账号的 login()

应用最终不再使用 SDK 时可以调用:

OpenIMClient.getInstance().unInit();

unInit() 用于释放 SDK 运行环境,不是 logout() 的替代品,也不应在普通页面销毁时调用。

下一步