YouTube视频无法在WebView中播放

时间:2013-07-17 17:40:45

标签: android video webview youtube

YouTube视频无法在WebView中播放。

这是我的第一个应用,我想做一个webview。 当我打开YouTube时,视频没有播放,正在加载但没有播放。 正在加载所有时间。 非常感谢您的帮助。

爪哇:

public class MainActivity extends Activity {

    private WebView mWebView;  

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

        mWebView = (WebView) findViewById(R.id.webview);
        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.loadUrl("http://www.google.com");
        mWebView.setWebViewClient(new HelloWebViewClient());

    }

private class HelloWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView webview, String url)
        {
        webview.loadUrl(url);
        return true;
    }}

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)
    {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack())
        {
            mWebView.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);

    }   }

XML:

<?xml version="1.0" encoding="utf-8"?>
<WebView  xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/webview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
/>

2 个答案:

答案 0 :(得分:21)

似乎与play youtube video in WebViewYouTube Video not playing in WebView - Android

重复

为了让它通过WebView工作,我使用了以下两个步骤(版本4.2.2 / Nexus 4):

  1. shouldOverrideUrlLoading点我添加了webview.setWebChromeClient(new WebChromeClient());

  2. AndroidManifest.xml activity代码中,我添加了android:hardwareAccelerated="true"

  3. AndroidManifest.xml还应包含Internet权限。

    虽然通过WebView播放视频的具体步骤可能特定于设备和Android版本,但还有其他WebView替代方案,如VideoView或使用Youtube Android Player API。

    <强> EDIT1

    至于暂停和全屏,这实际上是我在开头提到的第二个链接。为了方便起见,我发布的代码适用于我的Nexus。

    1. 在activity_main.xml

      <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:paddingBottom="@dimen/activity_vertical_margin"
          android:paddingLeft="@dimen/activity_horizontal_margin"
          android:paddingRight="@dimen/activity_horizontal_margin"
          android:paddingTop="@dimen/activity_vertical_margin"
       tools:context=".MainActivity" >
      
      <FrameLayout
                android:id="@+id/fullscreen_custom_content"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="#FF000000"/>
      
      <LinearLayout 
                android:id="@+id/linearlayout"
                android:layout_width="fill_parent" 
                android:layout_height="fill_parent"> 
      
           <WebView
                 android:id="@+id/webView"
                 android:layout_width="fill_parent"
                 android:layout_height="fill_parent" />
      
      </LinearLayout>
      </RelativeLayout>
      
    2. 在MainActivity类中:

      public class MainActivity extends Activity {
      
      private WebView mWebView;  
      private LinearLayout mContentView;
      private FrameLayout mCustomViewContainer;
      private WebChromeClient.CustomViewCallback mCustomViewCallback;
      FrameLayout.LayoutParams COVER_SCREEN_GRAVITY_CENTER = new FrameLayout.LayoutParams(
              ViewGroup.LayoutParams.WRAP_CONTENT,
              ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.CENTER);
      
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
      
          mContentView = (LinearLayout) findViewById(R.id.linearlayout);
          mWebView = (WebView) findViewById(R.id.webView);
          mCustomViewContainer = (FrameLayout) findViewById(R.id.fullscreen_custom_content);
      
          WebSettings webSettings = mWebView.getSettings();
          webSettings.setPluginState(WebSettings.PluginState.ON);
          webSettings.setJavaScriptEnabled(true);
          webSettings.setUseWideViewPort(true);
          webSettings.setLoadWithOverviewMode(true);
      
          mWebView.loadUrl("http://www.google.com");
          mWebView.setWebViewClient(new HelloWebViewClient());
      
      }
      
      @Override
      public boolean onCreateOptionsMenu(Menu menu) {
          // Inflate the menu; this adds items to the action bar if it is present.
          getMenuInflater().inflate(R.menu.main, menu);
          return true;
      }
      
      
      
      private class HelloWebViewClient extends WebViewClient  {
          @Override
          public boolean shouldOverrideUrlLoading(WebView webview, String url)
          {
              webview.setWebChromeClient(new WebChromeClient() {
      
                  private View mCustomView;
      
                   @Override
                  public 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();
                  }
      
              }); 
      
            webview.loadUrl(url);
      
            return true;
          }
      }
      
      @Override
      public boolean onKeyDown(int keyCode, KeyEvent event)
      {
          if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack())
          {
              mWebView.goBack();
              return true;
          }
          return super.onKeyDown(keyCode, event);
      
      } 
      }
      
    3. EDIT2 - 添加后退按钮支持

      public class MainActivity extends Activity {
      
      private WebView mWebView;  
      private LinearLayout mContentView;
      private FrameLayout mCustomViewContainer;
      private View mCustomView;
      private WebChromeClient.CustomViewCallback mCustomViewCallback;
      FrameLayout.LayoutParams COVER_SCREEN_GRAVITY_CENTER = new FrameLayout.LayoutParams(
              ViewGroup.LayoutParams.WRAP_CONTENT,
              ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.CENTER);
      
      private WebChromeClient mWebChromeClient;
      
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
      
          mContentView = (LinearLayout) findViewById(R.id.linearlayout);
          mWebView = (WebView) findViewById(R.id.webView);
          mCustomViewContainer = (FrameLayout) findViewById(R.id.fullscreen_custom_content);
      
          mWebChromeClient = new WebChromeClient() {
      
      
               @Override
              public 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();
              }
      
               @Override
               public 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);
               } 
          };
      
          WebSettings webSettings = mWebView.getSettings();
          webSettings.setPluginState(WebSettings.PluginState.ON);
          webSettings.setJavaScriptEnabled(true);
          webSettings.setUseWideViewPort(true);
          webSettings.setLoadWithOverviewMode(true);
      
          mWebView.loadUrl("http://www.google.com");
          mWebView.setWebViewClient(new HelloWebViewClient());
      
      }
      
      @Override
      public boolean onCreateOptionsMenu(Menu menu) {
          // Inflate the menu; this adds items to the action bar if it is present.
          getMenuInflater().inflate(R.menu.main, menu);
          return true;
      }
      
      
      
      private class HelloWebViewClient extends WebViewClient  {
      
          @Override
          public boolean shouldOverrideUrlLoading(WebView webview, String url)
          {
              webview.setWebChromeClient(mWebChromeClient);   
              webview.loadUrl(url);
      
            return true;
          }
      }
      
      @Override
      protected void onStop() {
      
          super.onStop();
          if (mCustomView != null)
          {
              if (mCustomViewCallback != null)
                  mCustomViewCallback.onCustomViewHidden();
              mCustomView = null;
          }
      
      }
      
      @Override
      public void onBackPressed() {
      
          super.onBackPressed();
           if (mCustomView != null)
           {
               mWebChromeClient.onHideCustomView();
           } else
           {
               finish();
           }
      }
      
      @Override
      public boolean onKeyDown(int keyCode, KeyEvent event)
      {
          if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack())
          {
              mWebView.goBack();
              return true;
          }
          return super.onKeyDown(keyCode, event);
      
      }   
      }
      

答案 1 :(得分:0)

web = (WebView) vi.findViewById(R.id.offer_webView1);

        web.loadUrl(getResources().getString(R.string.videolink));

        web.getSettings().setJavaScriptEnabled(true);
        // web.getSettings().setDomStorageEnabled(true);

        web.getSettings().setAllowContentAccess(true);
        WebSettings webSettings = web.getSettings();
        webSettings.setPluginState(WebSettings.PluginState.ON);
        webSettings.setUseWideViewPort(true);
        webSettings.setLoadWithOverviewMode(true);
        web.canGoBack();
        web.setWebChromeClient(new WebChromeClient() {});