为啥我的全屏 webview 在打开后会立即关闭?

Posted

技术标签:

【中文标题】为啥我的全屏 webview 在打开后会立即关闭?【英文标题】:Why is my full screen webview constantly closing immediately after opening?为什么我的全屏 webview 在打开后会立即关闭? 【发布时间】:2017-12-19 19:00:26 【问题描述】:

我的全屏视频 webview 几乎总是在打开后立即关闭,有时它可以工作。几乎每次我单击 youtube 视频上的全屏按钮时,您都会看到屏幕闪烁到全屏并返回原始屏幕。这可能是什么原因?

webview 与一些其他片段一起显示在 tablayout/viewpager 设置中。

我已使用此代码显示视频: https://github.com/cprcrack/VideoEnabledWebView

现在我正在使用这个https://github.com/GoogleChrome/chromium-webview-samples/blob/master/fullscreen-video-sample/app/src/main/java/fullscreenvideosample/android/chrome/google/com/fullscreenvideosample/MainActivity.java

它们产生完全相同的行为。

全屏失败时记录,打开后立即恢复正常:

07-14 17:41:06.694 D/ViewRootImpl@33432e1[GroupActivity]: ViewPostImeInputStage processPointer 0
07-14 17:41:06.786 D/ViewRootImpl@33432e1[GroupActivity]: ViewPostImeInputStage processPointer 1
07-14 17:41:06.803 D/InputMethodManager: HSI from window - flag : 0 Pid : 6392
07-14 17:41:07.512 D/ViewRootImpl@33432e1[GroupActivity]: ViewPostImeInputStage processPointer 0
07-14 17:41:07.592 D/ViewRootImpl@33432e1[GroupActivity]: ViewPostImeInputStage processPointer 1
07-14 17:41:07.615 D/InputMethodManager: HSI from window - flag : 0 Pid : 6392
07-14 17:41:07.709 V/InputMethodManager: Starting input: tba=android.view.inputmethod.EditorInfo@3e22579 nm : com.linkhubapp ic=null
07-14 17:41:07.709 I/InputMethodManager: [IMM] startInputInner - mService.startInputOrWindowGainedFocus
07-14 17:41:07.713 D/InputTransport: Input channel constructed: fd=152
07-14 17:41:07.714 D/InputTransport: Input channel destroyed: fd=159
07-14 17:41:07.714 D/InputMethodManager: HSI from window - flag : 0 Pid : 6392
07-14 17:41:07.751 D/ViewRootImpl@33432e1[GroupActivity]: Relayout returned: oldFrame=[0,0][1440,2560] newFrame=[0,0][1440,2560] result=0x1 surface=isValid=true -1176543232 surfaceGenerationChanged=false
07-14 17:41:07.911 D/ViewRootImpl@33432e1[GroupActivity]: Relayout returned: oldFrame=[0,0][1440,2560] newFrame=[0,0][1440,2560] result=0x7 surface=isValid=true -1273339904 surfaceGenerationChanged=true
07-14 17:41:07.921 D/mali_winsys: EGLint new_window_surface(egl_winsys_display*, void*, EGLSurface, EGLConfig, egl_winsys_surface**, egl_color_buffer_format*, EGLBoolean) returns 0x3000,  [1440x2560]-format:1
07-14 17:41:07.922 D/ViewRootImpl@33432e1[GroupActivity]: mHardwareRenderer.updateSurface() mSurface=isValid=true -1273339904
07-14 17:41:07.974 D/SurfaceView: Relayout returned: oldFrame=[0,0][0,0] newFrame=[0,875][1440,1685] result=0x7 surface=Surface(name=null)/@0xb9ffb70 isValid=true -1178691584
07-14 17:41:08.047 D/SurfaceView: Relayout returned: oldFrame=[0,875][1440,1685] newFrame=[0,875][1440,1685] result=0x5 surface=Surface(name=null)/@0xb9ffb70 isValid=false 0
07-14 17:41:08.095 D/InputMethodManager: HSI from window - flag : 0 Pid : 6392
07-14 17:41:08.163 D/ViewRootImpl@33432e1[GroupActivity]: Relayout returned: oldFrame=[0,0][1440,2560] newFrame=[0,0][1440,2560] result=0x1 surface=isValid=true -1273339904 surfaceGenerationChanged=false
07-14 17:41:08.232 V/InputMethodManager: Starting input: tba=android.view.inputmethod.EditorInfo@1772e0f nm : com.linkhubapp ic=null
07-14 17:41:08.232 I/InputMethodManager: [IMM] startInputInner - mService.startInputOrWindowGainedFocus
07-14 17:41:08.233 D/InputTransport: Input channel constructed: fd=173
07-14 17:41:08.233 D/InputTransport: Input channel destroyed: fd=152

全屏成功时的日志:

07-14 17:41:27.987 D/ViewRootImpl@33432e1[GroupActivity]: ViewPostImeInputStage processPointer 0
07-14 17:41:28.023 D/ViewRootImpl@33432e1[GroupActivity]: ViewPostImeInputStage processPointer 1
07-14 17:41:28.048 D/InputMethodManager: HSI from window - flag : 0 Pid : 6392
07-14 17:41:28.496 D/ViewRootImpl@33432e1[GroupActivity]: ViewPostImeInputStage processPointer 0
07-14 17:41:28.571 D/ViewRootImpl@33432e1[GroupActivity]: ViewPostImeInputStage processPointer 1
07-14 17:41:28.616 D/InputMethodManager: HSI from window - flag : 0 Pid : 6392
07-14 17:41:28.719 V/InputMethodManager: Starting input: tba=android.view.inputmethod.EditorInfo@80b2646 nm : com.linkhubapp ic=null
07-14 17:41:28.719 I/InputMethodManager: [IMM] startInputInner - mService.startInputOrWindowGainedFocus
07-14 17:41:28.725 D/InputTransport: Input channel constructed: fd=155
07-14 17:41:28.725 D/InputTransport: Input channel destroyed: fd=173
07-14 17:41:28.725 D/InputMethodManager: HSI from window - flag : 0 Pid : 6392
07-14 17:41:28.766 D/ViewRootImpl@33432e1[GroupActivity]: Relayout returned: oldFrame=[0,0][1440,2560] newFrame=[0,0][1440,2560] result=0x1 surface=isValid=true -1273339904 surfaceGenerationChanged=false
07-14 17:41:28.956 D/ViewRootImpl@33432e1[GroupActivity]: Relayout returned: oldFrame=[0,0][1440,2560] newFrame=[0,0][1440,2560] result=0x1 surface=isValid=true -1273339904 surfaceGenerationChanged=false
07-14 17:41:29.036 D/SurfaceView: Relayout returned: oldFrame=[0,0][0,0] newFrame=[0,875][1440,1685] result=0x7 surface=Surface(name=null)/@0xc360d2 isValid=true -1273337856
07-14 17:41:29.089 D/SurfaceView: Relayout returned: oldFrame=[0,875][1440,1685] newFrame=[0,875][1440,1685] result=0x1 surface=Surface(name=null)/@0xc360d2 isValid=true -1311279104

编辑: 它似乎只发生在 youtube 上。测试了 Vimeo 与 youtube。 Vimeo 每次都会打开。

【问题讨论】:

是在特定设备上发生还是您尝试过其他设备? 目前只在三星 Galaxy S6 上测试过。明天我会尝试做一些测试。 相关:***.com/questions/15768837/… @BertrandMartel 感谢您的回复,但这个问题是关于如何全屏显示视频的,我知道它是如何工作的,我之前已经做过很多次了。但是现在不知什么原因,打开后全屏随机关闭……不知道怎么回事。 其他设备上发生了什么? 【参考方案1】:

我能想到的最好的事情是您的设备内存不足。所以我有一些建议给你。

首先,当所有内存都空闲时,在您的设备上测试它并检查结果。

其次,你提到你有一个 Galaxy S6 和一个 Galaxy S3,在这两个设备上运行你的应用程序。

此外,如果您可以在另一台 Galaxy S6 上测试您的应用程序并查看它是否重复,这将非常有帮助。

收集这些信息后,您或许能够找到解决问题的方法。

您可以测试的另一件事是使用android:hardwareAccelerated="true" 并检查它是否有帮助。

【讨论】:

在 S3、S6 和 S7 上的行为相同。 "android:hardwareAccelerated="true"" 我已经设置好了。【参考方案2】:

这不是直接回答您的问题,而是提供了另一种选择。

根据您的使用情况,可以在 YouTube 应用上而不是在 WebView 内显示视频。 大多数 Android 设备(如果不是全部)都安装了 YouTube 应用。

public void playVideo(String key)

    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("vnd.youtube:" + key));

    // Check if the youtube app exists on the device
    if (intent.resolveActivity(getPackageManager()) == null) 
        // If the youtube app doesn't exist, then use the browser
        intent = new Intent(Intent.ACTION_VIEW,
                Uri.parse("http://www.youtube.com/watch?v=" + key));
     else 
        startActivity(intent);
    

这需要用户点击“返回”才能稍后返回您的应用。 但它可能会给用户带来更好的视频体验。

【讨论】:

是的,我知道我可以通过 youtube 应用程序打开它,但它不符合这个项目的要求。无论如何,谢谢【参考方案3】:

在与@CantThinkOfAnything 的讨论中,我们发现了确切的问题并提出了解决方案。看起来这是三星手机的内部问题。他们有自己的 WebView 实现,在一些细节和方法上与 Chrome WebView 不同。在尝试克服三星设备上的 webview 问题之前(说克服 - 我的意思是使用另一种方法,而不是 webview)尝试:

更新您的网络视图 查看你使用的是什么WebView实现开发者选项->WebView实现这里可以切换

在这种情况下,我们只在播放 youtube 视频时遇到了问题。因此,在使用 Youtube SDK 之前,您可以尝试构建自己的播放器:

<iframe   src="http://www.youtube.com/embed/M68lNfqmTNk" frameborder="0" allowfullscreen></iframe>

您需要将其作为单独的 html 加载到您的 webview 中。这是一种肮脏的方法,有很多缺点。可能,您不应该使用它。所以我们以使用 Youtube SDK 的解决方案结束,它比 iframe 好得多。 @CantThinkOfAnything - 如果我遗漏了什么,请纠正我。

附: - 在其他情况下,三星 webview 对我们来说效果很好。

【讨论】:

你去。谢谢! :D “更新您的网络视图”是什么意思?我在问,因为我目前在特定的三星设备上遇到同样的问题,唯一的区别是我的 WebView 并不总是显示 youtube 播放器,它有时会显示一个充满文本的页面,用 html 自定义/css.

以上是关于为啥我的全屏 webview 在打开后会立即关闭?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Spring Boot web app 启动后会立即关闭?

webview上的Html5视频缺少棒棒糖上的全屏按钮

为啥我的vbs文件打开后会自动关闭

PyQt:为啥新窗口在打开后立即关闭[重复]

为啥我的 Fancybox 窗口会立即打开和关闭?

关闭 MPMoviePlayerViewController 的全屏模式时出现问题