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

Видео YouTube не воспроизводится в 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"
/>

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


Ответы (2)


Похоже на дубликат воспроизведения видео YouTube в WebView и Видео YouTube не воспроизводится в 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 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 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