浏览 SDKs · Android
SDKsAndroid

认证与管理登录会话

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

复制

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

完整流程如下:

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

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

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

Application 生命周期内创建数据目录、初始化 SDK,并传入连接 listener。应用应保存连接状态,但不要在 callback 中记录 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() {
        sessionState.setConnectionState("connecting");
    }

    @Override
    public void onConnectSuccess() {
        sessionState.setConnectionState("connected");
        sessionState.enableConnectedOperations();
    }

    @Override
    public void onConnectFailed(long code, String error) {
        sessionState.setConnectionState("failed");
        recordConnectionFailure(code, error);
    }

    @Override
    public void onKickedOffline() {
        sessionState.clearCurrentAccount();
        showSignedInElsewhereScreen();
    }

    @Override
    public void onUserTokenExpired() {
        requestNewTokenAndRelogin();
    }

    @Override
    public void onUserTokenInvalid(String reason) {
        sessionState.clearCurrentAccount();
        showSignInScreen(reason);
    }
};

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

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

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

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

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

在登录前设置业务 listener

SDK 的 listener 注册方法采用 set 语义,后一次设置会替换前一次设置。应由应用级事件中心创建稳定 listener,再把事件分发给页面状态层。消息 listener 的完整注册与增量合并示例见发送第一条消息;用户、好友、会话、群组和通话信令 listener 采用相同的集中注册原则。

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

登录当前用户

OpenIMClient.getInstance().login(new OnBase<String>() {
    @Override
    public void onError(int code, String error) {
        sessionState.setLoginState("failed");
        recordLoginFailure(code, error);
    }

    @Override
    public void onSuccess(String data) {
        sessionState.setLoginState("logged");
        sessionState.setCurrentUserID(userID);
    }
}, userID, token);

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

查询登录状态

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

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

getLoginStatus()getLoginUserID() 返回本地 SDK 状态快照,不会触发连接 callback。切换账号时应先退出旧账号,而不是直接用新参数覆盖当前登录。

处理 Token 和强制下线

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

这些 callback 没有业务实体合并键,应按当前 OpenIMClient 单例和登录用户隔离状态。旧账号的异步任务和页面订阅必须在新账号登录前停止。

主动退出与释放 SDK

OpenIMClient.getInstance().logout(new OnBase<String>() {
    @Override
    public void onError(int code, String error) {
        recordLogoutFailure(code, error);
    }

    @Override
    public void onSuccess(String data) {
        sessionState.clearCurrentAccount();
    }
});

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

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

OpenIMClient.getInstance().unInit();

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

下一步