认证与管理登录会话
使用 OpenIM Android SDK 初始化、登录、查询登录状态、处理连接 callback 并退出当前账号。
OpenIM Android SDK 使用 initSDK() 初始化本机运行环境,再使用 login() 建立当前用户的登录会话。开始认证前,应先完成开始之前列出的服务、用户和 Token 准备,并按按 Android 环境接入添加依赖和权限。
完整流程如下:
- 在应用级会话组件中创建稳定的
OnConnListener。 - 调用
initSDK()并确认返回true。 - 在登录前设置消息、用户、好友、会话、群组和通话信令 listener。
- 从可信后端取得对应的
userID与 Token,然后调用login()。 - 分别等待登录 callback 成功与
onConnectSuccess(),再开放依赖连接的业务操作。 - 主动退出或切换账号时调用
logout(),完成后清理当前账号的应用状态。
下文中的 apiAddr、wsAddr、userID 和 token 均由可信后端提供。
初始化并处理连接生命周期
在 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() 后开始反映长连接状态。
| 字段 | 类型 | 说明 |
|---|---|---|
application | Application | 应用级 Context,用于持有 SDK 生命周期。 |
apiAddr | String | OpenIMServer HTTP API 地址。 |
wsAddr | String | OpenIMServer WebSocket 地址。 |
dataDirectory | File | SDK 数据库和日志使用的应用私有持久化目录。 |
config.logLevel | int | 使用 LogLevel 常量;正式环境应主动收敛日志级别。 |
isLogStandardOutput | boolean | 是否把 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.Logout | SDK 当前未登录。 |
LoginStatus.Logging | 登录正在进行,不应再次发起并行登录。 |
LoginStatus.Logged | SDK 已登录;网络是否连接仍以 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() 的替代品,也不应在普通页面销毁时调用。
下一步
这个页面有帮助吗?