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
相关产品推荐
相关产品推荐

