晚上好🌙🌙🌙
本答案参考通义千问
你提到的问题是关于 GsyVideoPlayer v11.3.0 在全屏播放时,暂停后返回竖屏出现黑屏 的情况。这种现象在 ijk、exo、ali 内核 中都存在,且部分情况下正常,但偶尔黑屏,拖动进度条可以显示画面但不播放,点击播放按钮也无反应。
一、问题分析
这个问题的核心原因在于:
- 全屏切换与播放状态的同步问题:在某些设备或系统版本上,GsyVideoPlayer 在切换回竖屏时,可能没有正确恢复播放器的状态。
- 播放器生命周期管理问题:当从全屏切换到竖屏时,可能触发了
onPause() 或 onStop(),导致播放器被意外停止,但未重新启动。 - 监听器逻辑问题:你目前的
setGSYVideoProgressListener 可能触发了 onVideoPause(),但这并不等同于真正的“暂停”操作,可能导致播放器状态混乱。
二、解决方案(重点加粗)
1. 避免在进度监听中直接调用 onVideoPause()
你当前的代码如下:
setGSYVideoProgressListener(new GSYVideoProgressListener() {
@Override
public void onProgress(long progress, long secProgress, long currentPosition, long duration) {
int position = (int) TimeUnit.MILLISECONDS.toSeconds(currentPosition);
if (position >= 300) {
detailPlayer.onVideoPause();
...
}
}
});
⚠️ 问题点:onVideoPause() 是一个模拟的暂停操作,它只是改变 UI 状态,并不会真正停止播放器,可能会导致播放器处于“假暂停”状态。
✅ 建议修改为使用 pause() 方法,并确保播放器状态同步。
if (position >= 300) {
detailPlayer.pause(); // 正确的暂停方法
if (orientationUtils.getScreenType() != ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
orientationUtils.resolveByClick();
detailPlayer.onBackFullscreen();
}
}
2. 在 onBackFullscreen() 之后检查播放器状态
你可以在 onBackFullscreen() 后添加对播放器状态的判断和恢复:
detailPlayer.onBackFullscreen();
if (detailPlayer.isPlaying()) {
detailPlayer.startPlayLogic(); // 强制重新开始播放
}
3. 确保 onResume() 和 onPause() 正确处理
在 Activity 或 Fragment 中,确保 onResume() 和 onPause() 中调用了播放器的对应方法:
@Override
protected void onResume() {
super.onResume();
detailPlayer.onResume();
}
@Override
protected void onPause() {
super.onPause();
detailPlayer.onPause();
}
4. 设置 setIsTouchWiget(false) 避免误触
有时候,播放器在竖屏下会自动隐藏控件,导致无法点击播放按钮。你可以尝试禁用触摸控制:
detailPlayer.setIsTouchWiget(false);
5. 检查播放器是否已释放资源
如果播放器在某个地方被提前释放(如 release() 被调用),则会导致黑屏。确保你只在 onDestroy() 中调用 release()。
三、完整修改后的代码示例
detailPlayer.setGSYVideoProgressListener(new GSYVideoProgressListener() {
@Override
public void onProgress(long progress, long secProgress, long currentPosition, long duration) {
int position = (int) TimeUnit.MILLISECONDS.toSeconds(currentPosition);
if (position >= 300) {
detailPlayer.pause(); // 使用 pause() 替代 onVideoPause()
if (orientationUtils.getScreenType() != ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
orientationUtils.resolveByClick();
detailPlayer.onBackFullscreen();
if (detailPlayer.isPlaying()) {
detailPlayer.startPlayLogic(); // 恢复播放
}
}
}
}
});
// 设置播放器控件不响应触摸
detailPlayer.setIsTouchWiget(false);
// 在 onResume 中恢复播放器
@Override
protected void onResume() {
super.onResume();
detailPlayer.onResume();
}
// 在 onPause 中暂停播放器
@Override
protected void onPause() {
super.onPause();
detailPlayer.onPause();
}
四、其他可能的原因及排查建议
| 问题 | 解决方案 |
|------|----------|
| 播放器内核问题 | 尝试更新 GsyVideoPlayer 到最新版本(v12.x)或使用 exoplayer 作为内核 |
| 系统兼容性问题 | 测试不同 Android 版本(如 Android 9/10/11)下的表现 |
| 布局问题 | 确保播放器容器在竖屏下有足够空间显示视频 |
| 日志跟踪 | 添加 Log.d("Gsy", "播放器状态: " + detailPlayer.isPlaying()) 来确认播放状态 |
五、总结
重点解决方式:
- 不要在
onProgress 中使用 onVideoPause(),而是使用 pause() - 在
onBackFullscreen() 后手动恢复播放 - 确保
onResume() 和 onPause() 正确调用 - 避免误触控件,设置
setIsTouchWiget(false)
如果你仍然遇到问题,建议你提供具体的 Android 版本、设备型号、GsyVideoPlayer 版本、播放器配置代码,以便进一步定位问题。