You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android端OpenVidu会话停止屏幕共享需调用哪些方法与事件?

OpenVidu安卓端二次屏幕共享加载失败修复方案

根因

安卓端未实现JsonConstants.PARTICIPANT_UNPUBLISHED事件的处理逻辑:远端用户停止屏幕共享后,本地没有清理对应流的订阅实例、渲染资源,导致同个用户再次发起共享时,客户端无法正确完成新流的订阅、渲染绑定,最终出现二次共享画面无法加载的问题。

具体修复逻辑

1. 补全事件分支映射

在handleServerEvent方法的switch分支中,为PARTICIPANT_UNPUBLISHED事件绑定对应的处理方法:

case JsonConstants.PARTICIPANT_UNPUBLISHED:
    participantUnpublishedEvent(params);
    break;

2. 实现流取消发布的处理方法

参考现有participantLeftEvent的资源清理逻辑,注意该事件仅代表用户停止发流、并未退出房间,不需要移除整个参与者对象,仅清理流相关资源即可,核心实现如下:

private void participantUnpublishedEvent(JSONObject params) throws JSONException {
    // 解析取消发布流的用户连接ID
    final String connectionId = params.getString("id");
    // UI和资源操作必须切主线程执行
    activity.runOnUiThread(() -> {
        Participant participant = participants.get(connectionId);
        if (participant == null) return;

        Subscriber subscriber = participant.getSubscriber();
        if (subscriber != null) {
            // 释放渲染视图资源
            SurfaceViewRenderer renderView = (SurfaceViewRenderer) subscriber.getView();
            if (renderView != null) {
                renderView.release();
                views_container.removeView(renderView);
            }
            // 销毁订阅实例,断开对应PeerConnection连接
            subscriber.dispose();
            // 清空参与者绑定的订阅实例,预留位置给后续新发布的流
            participant.setSubscriber(null);
        }
    });
}

关键注意事项

  • 不要直接复用participantLeftEvent的全量逻辑:PARTICIPANT_LEFT代表用户完全退出房间,需要从本地participants集合中删除整个用户对象;PARTICIPANT_UNPUBLISHED仅代表用户暂时停止发流,用户仍在房间内,若错误删除参与者对象,后续用户重新发流触发PARTICIPANT_PUBLISHED事件时会找不到对应用户,导致订阅失败。
  • 必须调用SurfaceViewRenderer.release()释放纹理资源,否则会出现内存泄漏,新流渲染时可能出现黑屏、花屏问题。
  • 所有UI操作、渲染资源释放逻辑必须切换到主线程执行,避免触发线程安全异常。

内容的提问来源于stack exchange,提问作者Toby

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 04:15:31