it-roy-ru.com

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

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

28
wilxjcherokee

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

Во-первых, вам нужно создать собственный класс 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

49
Mark Parnell

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

Чтобы поймать URL-адрес видеоинформации, необходимо отменить метод 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);
        }
    }
}
0
Roman Black