浏览 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。应用可以根据这些回调维护当前连接状态。

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 常量设置 SDK 日志详细程度。
isLogStandardOutputboolean是否把 SDK 日志输出到标准日志流。

SDK 只应在 Application 或应用级会话组件中初始化一次。应用前后台状态与网络变化由 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() 的替代品,也不应在普通页面销毁时调用。

下一步