2013-07-17 6 views
4

Видео YouTube не воспроизводится в WebView.Видео YouTube не воспроизводится в WebView

Это мое первое приложение, я хочу сделать веб-просмотр. Когда я открываю YouTube, видео не воспроизводится, загружается, но не воспроизводится. Загружается все время. Большое вам спасибо за помощь.

Java:

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" 
/> 
+0

http://stackoverflow.com/questions/15768837/playing-html5-video-on-fullscreen-in-android-webview – EpicPandaForce

ответ

21

Похоже дубликата play youtube video in WebView и YouTube 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"

AndroidManifest.xml должен также содержать разрешение Интернет.

В то время как точные шаги с воспроизведением видео через 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); 
    
    } 
    } 
    

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); 

} 
} 
+0

Я видел его но он не работает. – omer341

+1

@ omer341 На какой версии Android вы пытаетесь запустить ее или подражать ей? Что вы пробовали? Было ли добавлено 'webview.setWebChromeClient (новый WebChromeClient() {});" и тег аппаратного ускорения, не полезный для вашего случая? –

+1

Я пытаюсь запустить его на планшете. На Android версии 4.1.2. – omer341

0

Добавление клиента webchrome решает эту проблему,

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() {}); 
+1

не работает для меня –

Смежные вопросы