Видеоклипът от 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"
/>

person omer341    schedule 17.07.2013    source източник
comment
stackoverflow.com/ въпроси/15768837/   -  person EpicPandaForce    schedule 26.11.2014


Отговори (2)


Изглежда като дубликат на възпроизвеждане на видеоклип от YouTube в WebView и YouTube Video не се възпроизвежда в 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.

РЕДАКТИРАНЕ1

Що се отнася до пауза и цял екран, това всъщност е втора връзка, която споменах в началото. За да го улесня, публикувам код, който работи на моя 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);

}   
}
person Alex P    schedule 17.07.2013
comment
@omer341 На коя версия на Android се опитвате да го стартирате или да го емулирате? какво си пробвал Добавянето на webview.setWebChromeClient(new WebChromeClient() {}); и маркера за хардуерно ускорение не беше ли полезно за вашия случай? - person Alex P; 18.07.2013
comment
Опитвам се да го стартирам на моя таблет На Android версия 4.1.2. - person omer341; 18.07.2013
comment
@omer341 Опитах няколко стъпки по-горе (добавени към отговор) за моя Nexus 4 и свърши работа. Опитвали ли сте точно тези стъпки? - person Alex P; 19.07.2013
comment
Но след като натиснах пауза на видеото, то стана черно и видеото не може да бъде на цял екран. - person omer341; 19.07.2013
comment
@ omer341 Можете да опитате редакцията, която публикувах по-горе. И ако се надяваме, че ще работи, можете да отмените/приложите допълнителни неща. - person Alex P; 20.07.2013
comment
Благодаря много, но имам още една грешка linearlayout не може да бъде разрешен или не е поле. - person omer341; 20.07.2013
comment
@omer341 linearlayout е идентификатор на LinearLayout в activity_main.xml в layout директория. Уверете се, че няма правописна грешка в XML и че действително се появява в този XML. - person Alex P; 20.07.2013
comment
Да, но имам грешка в xml Маркирането в документа след основния елемент трябва да е добре оформено. - person omer341; 20.07.2013
comment
@omer341 Публикувах пълното съдържание на моя activity_main.xml със заглавката, която обикновено се генерира. - person Alex P; 20.07.2013
comment
Съжалявам, не мога да изляза от цял ​​екран. И се срина, когато се върнах с бутона за връщане назад. Благодаря ви много за помощта. - person omer341; 20.07.2013
comment
@omer341 Публикувах друга редакция с поддръжка на бутон за връщане назад, която трябва да разреши и излизане от цял ​​екран (чрез връщане назад). За допълнителни въпроси, моля, отворете нов въпрос в SO и обобщете какво сте опитали. Освен това започнете да копаете кода и останете с проблема малко по-дълго, преди да попитате, т.е. опитайте се да го разрешите. - person Alex P; 20.07.2013
comment
Алекс, ако можете да превърнете тази проба в публичен проект на BitBucket, би било много полезно... трудно е да следвате трохите за хляб и това очевидно е малко труден въпрос за Android. - person TacB0sS; 24.10.2013
comment
Наистина доста хубав отговор, за съжаление в моя случай (използвах фрагмент, прикачвайки и отделяйки го към дейност) методите на WebChromeClient се извикват само при първото му създаване, докато при следващи творения те изобщо не се извикват. Не можах да разбера защо, просто превключих на Intent за външно приложение, което вместо това да върши работата по възпроизвеждане на филм. - person Giulio Piancastelli; 19.12.2013

Добавянето на 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() {});
person arun-r    schedule 03.04.2015