YouTube视频无法在WebView中播放 - Android

Ran*_*del 44 youtube video android android-webview

我想在WebView中播放YouTube视频,WebView首先显示带有播放按钮的视频,但点击播放按钮后开始进度条,2-3秒后停止进度条和黑色屏幕空白.

Image1:视频首先看播放按钮

Image2:点击播放按钮后屏幕变为空白.

请!帮助我为什么视频没有开始.

IMAGE:1 这是Web视图的第一眼

IMAGE:2 在此输入图像描述

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

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;
}
Run Code Online (Sandbox Code Playgroud)

Łuk*_*mek 71

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

wv.setWebChromeClient(new WebChromeClient() {
});
Run Code Online (Sandbox Code Playgroud)

从文档:

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


Nic*_*ion 18

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

我通过查看作为AOSP一部分提供的浏览器源代码来组装它.

此代码引用了4个视图,这些视图可能并不明显.视图层次结构是:

  • FrameLayout mContentView (根)
  • WebView mWebView (mContentView的子代)
  • FrameLAyout mCustomViewContainer (mContentView的子代)
  • View mCustomView (mCustomViewContainer的孩子)

视图配置为设置容器活动的一部分.

<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>
Run Code Online (Sandbox Code Playgroud)

在您的活动中onCreate:

    mContentView = (FrameLayout) findViewById(R.id.main_content);
    mWebView = (WebView) findViewById(R.id.webView);
    mCustomViewContainer = (FrameLayout) findViewById(R.id.fullscreen_custom_content);
Run Code Online (Sandbox Code Playgroud)

注册一个WebChromeClientmWebView.该客户端应覆盖以下2 - 4种方法:

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;
}
Run Code Online (Sandbox Code Playgroud)

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

@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();
    }
}
Run Code Online (Sandbox Code Playgroud)

对于您的活动,在活动停止或按下后退按钮时隐藏视频.

  • 你能提供干净的代码吗?有这么多错误?例如,mCustomView在哪里?什么是COVER_SCREEN_GRAVITY_CENTER? (11认同)

Sid*_*yas 12

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

if (Build.VERSION.SDK_INT < 8) {
            webview.getSettings().setPluginsEnabled(true);
        } else {
            webview.getSettings().setPluginState(PluginState.ON);
        }
Run Code Online (Sandbox Code Playgroud)

Thnaks

  • 它对我不起作用.而且,setPluginState(PluginState.ON); 被解除了. (2认同)

kar*_*arn 5

在移动设备上流式传输的youtbe视频存在一些问题.如果您直接尝试在Web视图中加载URL并运行它,则视频将无法播放.解决此问题的一种困难方法是在视频视图中流式传输视频.我没试过,但这可以做到.
播放YouTube视频的其他方式,我称之为更简单的方法是将Web视图设置中的用户代理从移动设备更改为桌面.用户代理指示将运行YouTube视频的设备类型,因此服务器会发送该类型的网页.通过这种方式,可以流式传输和播放YouTube视频.以下是如何执行此操作的方法:

public static final int USER_MOBILE  = 0;
public static final int USER_DESKTOP = 1;
wv.getSettings().setUserAgent(USER_DESKTOP);   // 1 is for the desktop
Run Code Online (Sandbox Code Playgroud)