在 WebView 中播放的 YouTube 视频在全屏显示时显示黑屏

2023-12-23

简洁版本:为了播放 YouTube 视频,我使用这样的 WebView,

webView.loadData("<style> body{margin:0; background-color:black;}div{width:100%; height:100%; background-color:black}iframe{ width:100%; height:100%; border:none; overflow:hidden; }</style><div><iframe src=\"http://www.youtube-nocookie.com/embed/4eO9SS3wvLY?autoplay=1&rel=0&app=youtube_gdata&fs=1" frameborder=\"0\" allowfullscreen=\"allowfullscreen\" webkitallowfullscreen=\"webkitallowfullscreen\"></iframe></div>", "text/html", "utf-8");

一切正常,除了单击 [ ] 图标将视频全屏显示时,第一次、第二次和第三次尝试时显示黑屏。在第四次尝试时,它通常会正确地全屏显示视频。然而,情况并非总是如此。

Note:对于 Twitter 和 Facebook 视频,按预期全屏播放。

长版:

我用来实现此目的的代码是,

public class Test1Activity extends AppCompatActivity {

ViewGroup rootView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test1);

    rootView = findViewById(R.id.container);

    WebView webView = findViewById(R.id.web_view);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.setWebChromeClient(new WebChromeClient() {

        private View viewTakingFullScreen;

        @Override
        public void onShowCustomView(View view, CustomViewCallback callback) {
            //Log.d(TAG, "onShowCustomView(View:" + view + ", CustomViewCallback:" + callback + ")");
            super.onShowCustomView(view, callback);

            if (view instanceof FrameLayout) {
                // a video wants to be shown fullscreen
                viewTakingFullScreen = view;
                WindowManager.LayoutParams attrs = getWindow().getAttributes();
                attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
                attrs.flags |= WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
                getWindow().setAttributes(attrs);
                rootView.addView(view, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));

            }


        }

        @Override
        public void onHideCustomView() {
            //Log.d(TAG, "onHideCustomView()");
            super.onHideCustomView();

            if (viewTakingFullScreen != null) {
                WindowManager.LayoutParams attrs = getWindow().getAttributes();
                attrs.flags &= ~WindowManager.LayoutParams.FLAG_FULLSCREEN;
                attrs.flags &= ~WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
                getWindow().setAttributes(attrs);
                int index = rootView.indexOfChild(viewTakingFullScreen);
                rootView.removeViewAt(index);
                viewTakingFullScreen = null;
            }
        }
    });

    String htmlContent = "<style> body{margin:0; background-color:black;}div{width:100%; height:100%; background-color:black}iframe{ width:100%; height:100%; border:none; overflow:hidden; }</style><div><iframe src=\"http://www.youtube-nocookie.com/embed/4eO9SS3wvLY?autoplay=1&rel=0&app=youtube_gdata&fs=1\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\" webkitallowfullscreen=\"webkitallowfullscreen\"></iframe></div>";
    webView.loadData(htmlContent, "text/html", "utf-8");
    //webView.loadUrl("http://www.youtube-nocookie.com/embed/4eO9SS3wvLY?autoplay=1&rel=0&app=youtube_gdata&fs=1");
    }

}

这是我正在使用的布局(activity_test1.xml)文件,

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Top Button" />

        <WebView
            android:id="@+id/web_view"
            android:layout_width="match_parent"
            android:layout_height="450dp">

        </WebView>

    </LinearLayout>

</FrameLayout>

我已经尝试调试这个问题两天了,但没有成功。我觉得问题可能出在使用 YouTube 嵌入播放器<iframe>标签。但我在日志中没有看到错误的迹象。

另外,我正在使用<iframe>也可以播放 Twitter 和 Facebook 视频。但推特视频有<video>标签和 Facebook 视频有自己的嵌入播放器(https://www.facebook.com/video/embed?video_id= https://www.facebook.com/video/embed?video_id={如果})。他们似乎在全屏下工作得很好。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 WebView 中播放的 YouTube 视频在全屏显示时显示黑屏 的相关文章

随机推荐

  • 在 Java8 中设置 LocalDateTime 和时区的格式

    我有这个简单的代码 DateTimeFormatter FORMATTER DateTimeFormatter ofPattern yyyyMMdd HH mm ss SSSSSS Z LocalDateTime now format FO
  • 视图中的 HttpContext.User 或 Page.User?

    如果我在 Asp net MVC 的视图中编码并且我想获取当前用户 那么使用是否更好 Page User or HttpContext User 有区别吗 Page User回报this Context User这与HttpContext
  • ChromeDriver 控制台应用程序隐藏

    我创建了一个播放器 它将使用 C 中的 selenium 和 ChromeDriver 来自动化 chrome 运行良好 我面临的问题是 当它为 ChromDriver 创建对象时 它将启动 ChromeDriver 应用程序 该应用程序会
  • 反应事件未触发

    在与 img 标签并熟悉 React 我发现我的onLoad and onError事件没有触发 在将我的使用简化为最基本的 React 组件之后 我仍然发现事件没有触发 在下面的组件中 我希望单击渲染的 div 登录到控制台 它渲染得很好
  • Woocommerce - 产品页面中的描述

    我需要在 Woocommerce 插件中添加我的 产品 描述的一些摘录 我有这样的页面 http exploreprague cz guides buddies 2 http exploreprague cz guides buddies
  • 用户使用 Azure AD 身份验证登录后调用适用于 Teams 的图形 API

    在用户使用 Azure AD 登录应用程序后 我们尝试使用 Microsoft Graph API for Teams 用户应该能够向应用程序内的 Teams 频道发送消息 我试图得到访问令牌登录用户并将其作为不记名令牌传递给图形 API
  • 如何使用 transclude 将 ngRepeat“模板”传递给 ngDirective?

    Demo http plnkr co edit TiH96FCgOGnXV0suFyJA p preview http plnkr co edit TiH96FCgOGnXV0suFyJA p preview 我有一个名为 myDirect
  • 避免壁纸横跨 5 个屏幕

    我一直面临一个问题 如何在 Android 中设置壁纸 而不将其拉伸到 5 个主屏幕 需要明确的是 我有一个分辨率为 320x480px 的资源图像 当我在 Android 中将其设置为壁纸时 它会拉伸到 5 个屏幕 但我希望它仅显示在 1
  • 不允许 > 2mb 的图像

    你好 如何检查用户是否尝试上传大于 2mb 的文件 我想否认这一点 并向尝试这样做的用户发出错误消息 我知道是这样的 但是我该如何将 50000 更改为 2mb 呢 if FILES imagefile size gt 50000 die
  • 为什么使用片段?

    我已阅读文档并其他一些问题的主题 https softwareengineering stackexchange com q 200583 127226对于这个话题 我并没有真正被说服 我不清楚使用这种技术的局限性 碎片现在被视为最佳实践
  • 如何使用 mongodb 和 php 正确处理分页查询?

    我这样做对吗 我查看了一些使用 MySQL 的旧 PHP 代码 并设法让它工作 但是我想知道是否有一种更 干净 和 更快 的方法来完成此任务 首先我需要获取 文档 的总数 total documents collection gt find
  • 如果不是 SwingUtilities.invokeLater(),Java 剪贴板将忽略用户副本

    Problem 以编程方式在 Java 中设置剪贴板内容 然后获取剪贴板文本永远不会反映手动剪贴板内容更改 但是 推迟通过 SwingUtilities invokeLater 获取剪贴板文本直到处理完所有 Swing 事件确实反映了当前和
  • PinnedHeaderListView 示例

    我想实现一个列表视图 其部分标题类似于 Android 移动联系人中的部分标题 其中部分标题在滚动标题内的内容时不会滚动 我发现必须实现类似 PinnedHeaderListView 的东西 有人有关于如何开发 PinnedHeaderLi
  • javascript每9秒循环一次?

    我正在开发一个html5应用程序 我希望在写入随机位置8秒后 如果你赢了或没有赢一秒钟 它将写入 然后它将从创建一个新的随机开始 我已经尝试过但它似乎没有做任何事情 如果我写 while true 浏览器就会崩溃 有什么办法可以解决吗 jQ
  • TypeScript 第二个参数类型基于第一个参数类型

    我有第一个参数的可能值的枚举 并且我希望第二个参数基于第一个参数 因此 如果给出 NAME 我希望第二个参数为字符串 如果给出 AGE 我希望第二个参数是一个数字 我怎样才能做这样的事情 enum KeyType NAME AGE clas
  • 如何在mingw中静态链接libwinpthread-1.dll?

    我从这里使用 mingw http sourceforge net projects mingwbuilds files host windows releases 4 7 2 32 bit threads posix sjlj x32 4
  • Python:确定未排序的列表是否包含在“列表的列表”中,无论元素的顺序如何

    我有一个与这个问题类似的问题 确定 2 个列表是否具有相同的元素 无论顺序如何 https stackoverflow com questions 8866652 determine if 2 lists have the same ele
  • 如何使用 boost::spirit::lex 实现包含指令?

    我有一个由spirit lex 和spirit qi 构建的简单配置文件解析器 当词法分析器到达模式时include path 我希望包含文件的文本 如您所知 spirit lexer begin 启动扫描过程 Read file cont
  • JetBrains WebStorm 忽略缩进设置

    In Settings gt Code Style gt JavaScript我已经设置了Tab size and Indent4 为什么WebStorm仍然忽略这些设置 正如您在预览窗口中看到的 哪些设置可以覆盖这些设置 如果您启用了 E
  • 在 WebView 中播放的 YouTube 视频在全屏显示时显示黑屏

    简洁版本 为了播放 YouTube 视频 我使用这样的 WebView webView loadData div div