Подтвердить что ты не робот

Android WebView с встроенным видео с YouTube, полноэкранная кнопка замораживает видео

У меня есть андроид, который загружает блог Wordpress. Некоторые сообщения в блоге содержат видео с YouTube, которые я хотел бы, чтобы пользователь мог сделать полный экран, если захочет. Проблема заключается в том, что кнопка полного экрана HTML5 ничего не делает при нажатии, но замораживает представление. Любые идеи?

4b9b3361

Ответ 1

Это то, что я провел в последний день или так порвал свои волосы. Основываясь на разных битах кода со всего Интернета, мне удалось заставить его работать.

Сначала вам нужно создать пользовательский класс WebChromeClient, который реализует методы onShowCustomView и onHideCustomView.

private class MyWebChromeClient extends WebChromeClient {
    FrameLayout.LayoutParams LayoutParameters = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,
            FrameLayout.LayoutParams.MATCH_PARENT);

    @Override
    public void onShowCustomView(View view, CustomViewCallback callback) {
        // if a view already exists then immediately terminate the new one
        if (mCustomView != null) {
            callback.onCustomViewHidden();
            return;
        }
        mContentView = (RelativeLayout) findViewById(R.id.activity_main);
        mContentView.setVisibility(View.GONE);
        mCustomViewContainer = new FrameLayout(MainActivity.this);
        mCustomViewContainer.setLayoutParams(LayoutParameters);
        mCustomViewContainer.setBackgroundResource(android.R.color.black);
        view.setLayoutParams(LayoutParameters);
        mCustomViewContainer.addView(view);
        mCustomView = view;
        mCustomViewCallback = callback;
        mCustomViewContainer.setVisibility(View.VISIBLE);
        setContentView(mCustomViewContainer);
    }

    @Override
    public void onHideCustomView() {
        if (mCustomView == null) {
            return;
        } else {
            // 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);
            setContentView(mContentView);
        }
    }
}

В основном, что происходит здесь, когда нажата кнопка полного экрана, мы создаем новое представление, чтобы удерживать видео и скрывать основной вид. И затем, когда полный экран закрыт, мы делаем обратное - избавьтесь от нового представления и отобразите исходный вид.

Вам также нужно добавить все эти свойства в свой класс активности:

private MyWebChromeClient mWebChromeClient = null;
private View mCustomView;
private RelativeLayout mContentView;
private FrameLayout mCustomViewContainer;
private WebChromeClient.CustomViewCallback mCustomViewCallback;

И вы, вероятно, захотите закрыть полноэкранное видео при нажатии кнопки "Назад":

@Override
public void onBackPressed() {
    if (mCustomViewContainer != null)
        mWebChromeClient.onHideCustomView();
    else if (myWebView.canGoBack())
        myWebView.goBack();
    else
        super.onBackPressed();
}

Тогда это просто вопрос использования вашего нового класса при создании вашего веб-представления:

myWebView = (WebView) findViewById(R.id.webView1);
mWebChromeClient = new WMWebChromeClient();
myWebView.setWebChromeClient(mWebChromeClient);

Это работает для меня на Android 4.x. Не уверен в более ранних версиях, поскольку мое приложение не нацеливает их.

Я нашел эти ссылки особенно полезными: WebView и HTML5 <video> и http://code.google.com/p/html5webview/source/browse/trunk/HTML5WebView/src/org/itri/html5webview/HTML5WebView.java

Ответ 2

Вы можете запустить внешнее приложение YouTube, когда вы будете показывать информацию о видео, так как не важно показывать видеоролик YouTube непосредственно в приложении.

Чтобы узнать URL-адрес видеоинформации, вам необходимо выполнить команду owerride onLoadResource:

new WebViewClient() {

    @Override
    public void onLoadResource(WebView view, String url) {

        if (url.startsWith("http://www.youtube.com/get_video_info?")) {
            try {
                String path = url.replace("http://www.youtube.com/get_video_info?", "");

                String[] parqamValuePairs = path.split("&");

                String videoId = null;

                for (String pair : parqamValuePairs) {
                    if (pair.startsWith("video_id")) {
                        videoId = pair.split("=")[1];
                        break;
                    }
                }

                if(videoId != null){
                    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.youtube.com"))
                            .setData(Uri.parse("http://www.youtube.com/watch?v=" + videoId)));
                    needRefresh = true;

                    return;
                }
            } catch (Exception ex) {
            }
        } else {
            super.onLoadResource(view, url);
        }
    }
}