认证与管理登录会话
使用 OpenIM Android SDK 初始化、登录、查询登录状态、处理连接回调并退出当前账号。
OpenIM Android SDK 初始化本机运行环境后,通过建立当前用户的登录会话接入即时通讯服务。开始认证前,应先完成开始之前列出的服务、用户和 Token 准备,并按按 Android 环境接入添加依赖和权限。
完整流程如下:
- 在应用级会话组件中创建稳定的连接监听器
OnConnListener。 - 初始化 SDK 运行环境并确认初始化成功。
- 在登录前按业务模块集中设置事件监听器。
- 从业务后端取得对应的
userID与 Token,然后发起登录。 - 分别等待登录回调成功与长连接就绪通知,再开放依赖连接的业务操作。
- 主动退出或切换账号时注销会话,完成后清理当前账号的应用状态。
下文中的 apiAddr、wsAddr、userID 和 token 由应用配置或业务后端提供。
初始化并处理连接生命周期
在 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.");
}初始化方法返回 true 表示 SDK 本地运行环境初始化成功。OnConnListener 的连接回调在调用登录接口后开始反映长连接状态。
| 字段 | 类型 | 说明 |
|---|---|---|
application | Application | 应用级 Context,用于持有 SDK 生命周期。 |
apiAddr | String | OpenIMServer HTTP API 地址。 |
wsAddr | String | OpenIMServer WebSocket 地址。 |
dataDirectory | File | SDK 数据库和日志使用的应用私有持久化目录。 |
config.logLevel | int | 使用 LogLevel 常量设置 SDK 日志详细程度。 |
isLogStandardOutput | boolean | 是否把 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);登录回调成功表示当前账号认证请求已通过,而长连接就绪回调(onConnectSuccess)则表明长连接已经建立并就绪。两者的关注点不同:认证成功后通常紧接着建立长连接,但不要在登录完成前并发发起重复登录,也不要将认证结果直接等同于长连接已经打通。
查询登录状态
int loginStatus = OpenIMClient.getInstance().getLoginStatus();
if (loginStatus == LoginStatus.Logged) {
String currentUserID = OpenIMClient.getInstance().getLoginUserID();
// currentUserID 是当前登录用户 ID。
}| 状态 | 说明 |
|---|---|
LoginStatus.Logout | SDK 当前未登录。 |
LoginStatus.Logging | 登录正在进行,不应再次发起并行登录。 |
LoginStatus.Logged | SDK 已登录;网络是否连接仍以 OnConnListener 为准。 |
获取登录状态和获取当前用户 ID 的方法直接读取保存在本地 SDK 中的状态与用户标识,不会触发网络连接回调。切换账号时应先退出旧账号,而不是直接用新参数覆盖当前登录。
处理 Token 和强制下线
收到 Token 过期或 Token 失效回调后,可以向业务后端取得当前用户的新凭据,再重新登录或进入应用的登录流程。强制下线回调表示当前账号被其他设备或服务端强制踢下线,与用户主动退出是不同状态。
这些是当前登录账号级别的回调。切换账号前必须停止旧账号的异步任务和页面订阅,并清理旧账号状态。
主动退出与释放 SDK
OpenIMClient.getInstance().logout(new OnBase<String>() {
@Override
public void onError(int code, String error) {
// 根据 code 和 error 处理退出失败。
}
@Override
public void onSuccess(String data) {
// 登录会话已退出。
}
});退出成功表示当前 SDK 登录会话已注销。应用状态清理应在成功回调后执行;切换账号时,等待旧账号退出完成后再发起新账号的登录。
应用最终不再使用 SDK 时可以调用:
OpenIMClient.getInstance().unInit();反初始化用于释放 SDK 运行环境,不是注销登录会话的替代品,也不应在普通页面销毁时调用。
下一步
这个页面有帮助吗?