Java 接入
Java 门面随 SDK 制品提供,App 不需要配置 KSP。业务类型通常在 com.deeprespond.im,门面在 com.deeprespond.im.java。
初始化与恢复
import android.content.Context;
import com.deeprespond.im.*;
import com.deeprespond.im.java.*;
DRClientOptions options = DRClientOptions.builder("org#app", "https://api.example.com").build();
DRJavaClient im = DRClient.initialize(context, options).java();
im.auth().awaitRestored(new DRCallback<Void>() {
public void onSuccess(Void ignored) {
// 恢复后再根据 im.auth().getCurrentUser() 决定是否登录。
}
public void onError(DRException error) { /* 处理恢复失败 */ }
});初始化仅在用户同意隐私政策后、App 主进程执行。DRClient.getInstance().java() 取得同一客户端的门面,未初始化时 getInstance 抛 IllegalStateException。
回调与 Future
import com.deeprespond.im.*;
import com.deeprespond.im.java.*;
DRCancellable pending = im.auth().loginWithTicket(ticket, new DRCallback<LoginResult>() {
public void onSuccess(LoginResult result) { /* 默认回调在主线程 */ }
public void onError(DRException error) { /* 按 code 和 reason 判断 */ }
});
// 页面不再需要等待时:pending.cancel();无返回值方法对应 DRCallback<Void>,成功值为 null。生成的 suspend 方法提供回调入口和 ...Async() CompletableFuture 入口;withExecutor 设置回调线程。异步方法有重载和 Params 参数类,编辑器类型补全对应 Kotlin 的可选参数,不要将位置参数顺序照搬成 Java 的命名参数。
Future 在 SDK 线程完成,UI 更新应切换到主线程;withExecutor 只配置回调和监听的 Executor。取消 Future 用 cancel(true)。
import com.deeprespond.im.*;
import java.util.concurrent.CompletableFuture;
CompletableFuture<LoginResult> future = im.auth().loginWithTicketAsync(ticket);
future.whenComplete((result, error) -> {
if (error != null) {
// 处理异常;这里不能直接修改 Android View。
} else {
System.out.println(result.getSessionId());
}
});多个可选参数使用所属门面的 Params.builder();例如公开群查询:
import com.deeprespond.im.java.*;
DRGroupsModule.PublicGroupsParams params = DRGroupsModule.PublicGroupsParams.builder()
.namePrefix("项目")
.limit(20)
.build();
im.groups().publicGroupsAsync(params);DRCancellable.cancel 取消等待;已经入队的消息和已发出的持久写入继续按 SDK 规则处理。上传 / 下载任务真正取消需要调用任务的 cancel。
状态订阅
import com.deeprespond.im.java.*;
DRSubscription subscription = im.auth().observeState(state -> {
// 更新登录界面。
});
subscription.close(); // 实际在页面退出时关闭。门面提供同步 getter 和 observeXXX 订阅,订阅结束必须 close。不要把每次 getter 当作自动更新;示例 App 的 Java 页面展示恢复、订阅、诊断和异步结果。
参数与 Duration
DRClientOptions 使用 builder(appKey, apiUrl),DRPushOptions 使用 builder(credentials),DRCallOptions 与 MediaOptions 使用 builder。Kotlin Duration 在 Java 接入中使用毫秒入口,例如 userCacheTtlMillis、retryAfterMillis、OutgoingContent.voice(file, durationMs)、DndChange.On.ofMillis(durationMs)。
import com.deeprespond.im.*;
MediaOptions media = MediaOptions.builder()
.preprocess((file, kind, callback) -> callback.onSuccess(file))
.build();preprocess 替换默认媒体处理,业务自行保证文件可读及元数据清理;示例仅演示桥接,原样返回文件不是隐私清理实现。ticketProvider 使用 JavaTicketProvider 回调,回传业务服务端签发的 ticket。
Java 和 Kotlin 共用数据、会话、发送队列及权限规则。各业务模块的含义见对应章节,完整 Kotlin 签名见接口参考。
Java 与 Kotlin 对照
| Kotlin | Java 门面或规则 |
|---|---|
| DRClient | DRJavaClient,通过 client.java() 获取 |
| AuthModule、MessagesModule、GroupsModule 等 | DRAuthModule、DRMessagesModule、DRGroupsModule,通过 im.auth() / messages() / groups() 获取 |
| MessageList、LiveList、CallHandle、ChatroomHandle | DRMessageList、DRLiveList、DRCallHandle、DRChatroomHandle |
| StateFlow.value | getXXX() 同步读取,observeXXX(DRListener) 持续订阅 |
| suspend 方法 | 回调方法返回 DRCancellable;Async 方法返回 CompletableFuture |
| Duration 参数 | 同名 Java 方法的 Long 参数为毫秒,如 waitUntilReadyAsync(15000L) |
| CallHandle 的设备扩展 | DRJavaCalls 静态方法,例如 switchCameraAsync(handle)、observeAudioEndpoints(handle, listener) |
| 原生推送控制器 | DRPush.of(client) 返回 DRPushController;原生挂起调用仍按 Kotlin 协程接入 |
原生通知控制器没有独立回调门面。Java App 可由少量 Kotlin 接入层负责挂起的权限和登记操作,并向业务暴露自己的回调;不要为原生控制器推测不存在的 Async 方法。
独立频道
Java 门面为 DRChannelsModule 和 DRChannelHandle,支持 callback 与 Async 方法;observeCurrent、observeSnapshot、observeTracks 返回需关闭的 DRSubscription。
android.os.Handler mainHandler = new android.os.Handler(android.os.Looper.getMainLooper());
java.util.concurrent.Executor mainExecutor = task -> mainHandler.post(task);
DRChannelsModule channels = new DRChannelsModule(
DRClient.getInstance().getChannels(), mainExecutor);
ChannelJoinOptions options = new ChannelJoinOptions(ticket, null, false, false);
channels.join("meeting-demo", options, new DRCallback<DRChannelHandle>() {
public void onSuccess(DRChannelHandle channel) {
// 保存句柄;用户授权后手动启用采集;页面离开时 leave。
}
public void onError(DRException error) { /* 展示错误并允许用户决定下一步 */ }
});ChannelJoinOptions 的 Java 构造参数依次为 ticket、clientSessionId、microphoneEnabled、cameraEnabled。API 和权限限制同Kotlin 频道。
