Проигрывание YouTube видео с помощью WebView

    Некоторые разработчики под Андроид ОС могли столкнуться с проблемой проигрывания видео с youtube, в версии операционной системы 2.2 и старше. Когда старый вариант с использованием shouldOverrideUrlLoading уже перестал работать, а новые решения достаточно проблематично отыскать. В данном посте я предлагаю пример основанный на использовании некоторых особенностей WebView связанных с динамическим созданием так называемых CustomView.

    Описание происходящего


    Для упрощения работы с проигрыванием видео, разработчики Андроид уже добавили автоматическое создание потокового плеера со всеми необходимыми параметрами и VideoView для отображения этого потока. Нам как разработчикам нужно только корректно использовать всё это богатство и правильно им распорядиться.

    VideoView

    После клика пользователя на превью в WebView показывающем мобильную версию youtube:



    WebView вызывает передает в WebChromeClient объект содержащий уже запущеныей VideoView готовый к показу на экран, наша задача позволить данному View отобразить свой контент пользователю. Поэтому в методе onShowCustomView мы получаем и обрабатывем этот компонент, добавляя его в текущую иерархию виджетов.

    @Override<br/>
    public void onShowCustomView(View view, CustomViewCallback callback) {<br/>
        if (mCustomView !null) {<br/>
            callback.onCustomViewHidden();<br/>
        } else {<br/>
            mCustomView = view;<br/>
            mCustomViewCallback = callback;<br/>
            mWebView.setVisibility(View.GONE);<br/>
            mMainContentContainer.addView(view, CUSTOM_VIEW_LAYOUT_PARAMS);<br/>
        }<br/>
    }



    Но так как мы изменили текущий View, то для продолжения просмотра сайта, после просмотра видео или по клику на кнопку BACK, мы должны вернуть предидущее состояние иерархии, для этого используется ещё один метод из WebChromeClient, а именно onHideCustomView. В нем мы закрываем VideoView и продолжаем показ WebView.

    @Override<br/>
    public void onHideCustomView() {<br/>
        if (mCustomView !null) {<br/>
            mMainContentContainer.removeView(mCustomView);<br/>
            mCustomViewCallback.onCustomViewHidden();<br/>
            mCustomView = null;<br/>
            mWebView.setVisibility(View.VISIBLE);<br/>
        }<br/>
    }



    Этих действий вполне достаточно для работы с YouTube видео на Android 2.2.
    Пример работающего проекта.
    Поделиться публикацией

    Комментарии 10

      0
      я возможно плохо понял, но почему нельзя было просто послать интент?
        0
        в новых версиях андроида, начиная с 2.2 по клику на превью, не приходит ссылка вида «vnd.youtube:<видео айди>», а отрабатывает описанный мною механизм. Поэтому использовать shouldOverrideUrlLoading становиться крайне проблематично.
          0
          вы же в webview отображаете мобильную версию ютуба? не пробовали текущий url (чтото вроде m.youtube.com/video12345) отправить в
          Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            0
            Пробовал, не работает, в частости на гэлэкси с. А вот на стреньком хуавее продолжает работать старый вариант через посылку интента.
              –1
              [sarcasm]
              Да ладно вам, фрагментация на андроид — это миф.

              habrahabr.ru/blogs/android_development/129994/
              [/sarcasm]
                0
                тогда спасибо за топик, я этого не знал
          +1
          Что должно делать приложение?
          Я скачал проект, собрал, запустил… Приложение открыло выбор браузера, после чего открылся ютуб, при клике по превью вполне обычное поведение — предложило открыть через браузер или клиент для юбуба…
          Когда я немного допилил (поменял URL чтобы не было редиректа) ваше приложение чтобы открывалось во встроенном WebView, всё тоже самое…
            0
            Приложение должно открыть youtube.com в WebView, позволить ходить по ссылкам, а в случае клика по видео превью, запускать видео к просмотру. На этом вся функциональность ограничена, как-никак просто пример.
              0
              > при клике по превью вполне обычное поведение — предложило открыть через браузер или клиент для юбуба
              Таки целью было, как я понял, открывать видео внутри без предложения открыть ссылку внешним приложением?

              Кстати, ютуб через веб часто работает гораздо лучше встроенного приложения, особенно через медленный мобильный интернет (приложение может постоянно заикаться, сбрасывать кэш при перемотке и т.д, когда в вебе я получаю привычное поведение плеера и кэширование).
                0
                Да, совершенно верно, целью было реализовать проигрывание видео средствами WebView, на что, в принципе, и намекает заголовок.

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое