首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >YouTube视频在WebView中无法播放-安卓

YouTube视频在WebView中无法播放-安卓
EN

Stack Overflow用户
提问于 2012-10-03 20:50:47
回答 11查看 76.8K关注 0票数 45

我正在努力在WebView中播放YouTube视频,WebView显示第一看视频与播放按钮,但在点击播放按钮开始进度条和2-3秒后停止进度条和黑色屏幕空白。

Image1:带有播放按钮的视频优先显示

Image2:单击播放按钮后,屏幕变为空白。

请!帮我解释一下为什么视频不能启动。

图片:1

图片:2

这是我在webview中播放YouTubeVideo的源代码。请帮帮我。

代码语言:javascript
复制
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    WebView wv = (WebView) findViewById(R.id.webView1);
    wv.getSettings().setJavaScriptEnabled(true);
    wv.getSettings().setPluginsEnabled(true);
    final String mimeType = "text/html";
    final String encoding = "UTF-8";
    String html = getHTML();
    wv.loadDataWithBaseURL("", html, mimeType, encoding, "");
}

public String getHTML() {
    String html = "<iframe class=\"youtube-player\" style=\"border: 0; width: 100%; height: 95%; padding:0px; margin:0px\" id=\"ytplayer\" type=\"text/html\" src=\"http://www.youtube.com/embed/"
            + "J2fB5XWj6IE"
            + "?fs=0\" frameborder=\"0\">\n"
            + "</iframe>\n";
    return html;
}
EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2012-10-06 02:09:14

在将HTML内容加载到WebView之前添加这些行。

代码语言:javascript
复制
wv.setWebChromeClient(new WebChromeClient() {
});

从文档中:

为了在您的应用程序中支持内联HTML5视频,您需要打开硬件加速、并设置WebChromeClient。对于全屏支持,需要实现onShowCustomView(视图、WebChromeClient.CustomViewCallback)和onHideCustomView(),而getVideoLoadingProgressView()是可选的。

票数 71
EN

Stack Overflow用户

发布于 2012-10-12 09:00:29

需要以下代码来显示由web核心框架启动的视频播放器。整个流程的关键是将VideoView传递回WebChromeClient,您需要将该视图附加到视图层次结构。

我已经通过审阅作为AOSP的一部分提供的浏览器源代码来组装它。

这段代码引用了4个可能不太明显的视图。视图层次结构为:

  • FrameLayout mContentView (root)
  • WebView mWebView ( mContentView)
  • FrameLAyout mCustomViewContainer的子项) mContentView)
  • View mCustomView的子项( mCustomViewContainer)

的子项

这些视图被配置为设置容器活动的一部分。

代码语言:javascript
复制
<FrameLayout
    android:id="@+id/fullscreen_custom_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FF000000"/>

    <FrameLayout
        android:id="@+id/main_content"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" >

        <WebView
            android:id="@+id/webView"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />
    </FrameLayout>
</FrameLayout>

在您的Activities onCreate

代码语言:javascript
复制
    mContentView = (FrameLayout) findViewById(R.id.main_content);
    mWebView = (WebView) findViewById(R.id.webView);
    mCustomViewContainer = (FrameLayout) findViewById(R.id.fullscreen_custom_content);

mWebView注册WebChromeClient。该客户端应覆盖以下2-4个方法:

代码语言:javascript
复制
void onShowCustomView(View view, WebChromeClient.CustomViewCallback callback)
{
    // if a view already exists then immediately terminate the new one
    if (mCustomView != null)
    {
        callback.onCustomViewHidden();
        return;
    }

    // Add the custom view to its container.
    mCustomViewContainer.addView(view, COVER_SCREEN_GRAVITY_CENTER);
    mCustomView = view;
    mCustomViewCallback = callback;

    // hide main browser view
    mContentView.setVisibility(View.GONE);

    // Finally show the custom view container.
    mCustomViewContainer.setVisibility(View.VISIBLE);
    mCustomViewContainer.bringToFront();
}

void onHideCustomView()
{
    if (mCustomView == null)
        return;

    // Hide the custom view.
    mCustomView.setVisibility(View.GONE);
    // Remove the custom view from its container.
    mCustomViewContainer.removeView(mCustomView);
    mCustomView = null;
    mCustomViewContainer.setVisibility(View.GONE);
    mCustomViewCallback.onCustomViewHidden();

    // Show the content view.
    mContentView.setVisibility(View.VISIBLE);
}

public Bitmap getDefaultVideoPoster()
{
    if (mDefaultVideoPoster == null)
    {
        mDefaultVideoPoster = BitmapFactory.decodeResource(getResources(), R.drawable.default_video_poster);
    }
    return mDefaultVideoPoster;
}

public View getVideoLoadingProgressView()
{
    if (mVideoProgressView == null)
    {
        LayoutInflater inflater = LayoutInflater.from(this);
        mVideoProgressView = inflater.inflate(R.layout.video_loading_progress, null);
    }
    return mVideoProgressView;
}

您可能还想添加活动生命周期绑定,如下所示:

代码语言:javascript
复制
@Override
protected void onStop()
{
    super.onStop();
    if (mCustomView != null)
    {
        if (mCustomViewCallback != null)
            mCustomViewCallback.onCustomViewHidden();
        mCustomView = null;
    }
}

@Override
public void onBackPressed()
{
    if (mCustomView != null)
    {
        onHideCustomView();
    } else
    {
        finish();
    }
}

添加到您的活动,以便在活动停止或按下后退按钮时隐藏视频。

票数 18
EN

Stack Overflow用户

发布于 2013-02-07 12:45:59

添加webview.setWebChromeClient(new WebChromeClient());并为您的视频启用插件

代码语言:javascript
复制
if (Build.VERSION.SDK_INT < 8) {
            webview.getSettings().setPluginsEnabled(true);
        } else {
            webview.getSettings().setPluginState(PluginState.ON);
        }

技术

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12708890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档