Статьи

Использование API YouTube для встраивания видео в приложение Android

Этот пост был обновлен в январе 2017 года.

API проигрывателя YouTube Android позволяет вам включать функции воспроизведения видео в ваши приложения Android. API позволяет загружать и воспроизводить видео YouTube (и списки воспроизведения), а также настраивать и контролировать процесс воспроизведения видео.

Вы можете загружать или воспроизводить видео в виде плеера, встроенном в пользовательский интерфейс вашего приложения. Затем вы можете управлять воспроизведением программно. Например, воспроизведение, пауза или поиск определенной точки в загруженном видео. Вы можете зарегистрировать прослушиватели событий для получения обратных вызовов для определенных событий, таких как проигрыватель, загружающий видео или изменение состояния проигрывателя. API также имеет вспомогательные функции для поддержки изменений ориентации, а также переходов к полноэкранному воспроизведению.

Для начала создайте новый проект. Я назвал мой VideoTube. В следующем окне мастера Android Studio вы можете оставить версию Minimum SDK с API по умолчанию 15 (API YouTube будет работать только с API 10 и выше). Выберите шаблон Пустое действие в следующем окне и MainActivity в качестве имени действия в последнем.

Прежде чем использовать API Android Youtube, необходимо зарегистрировать свое приложение, в том числе публичный сертификат файла .apk с цифровой подписью, в консоли разработчиков Google. Чтобы зарегистрировать приложение, выполните следующие действия.

  1. Перейдите в консоль разработчиков Google
  2. Создать новый проект. Я назвал мой VideoTube .
  3. На боковой панели слева убедитесь, что выбрана библиотека . На правой панели выберите API данных Youtube и включите его на следующей странице.
  4. На боковой панели слева выберите Учетные данные . Для учетных данных API поддерживает OAuth 2.0, использование ключа API и учетной записи службы. Мы будем использовать ключ API.
  5. Выберите ключ API в раскрывающемся меню « Создать учетные данные» . Появится всплывающее окно со значением вашего ключа API. Держите это окно открытым, мы будем использовать ключ на следующем шаге.

Замечания:

Во всплывающем окне, в котором отображается ключ API, есть кнопка « Ограничить ключ» , которую можно использовать для ограничения ключа от несанкционированного использования. В этом руководстве мы не будем ограничивать ключ, но для приложения, которое вы планируете запустить в производство, вам обязательно нужно ограничить доступ к нему. Ограничение ключа позволяет указать, какие веб-сайты, IP-адреса или приложения могут использовать этот ключ. Это может помочь предотвратить несанкционированное использование и кражу квот.

Вернувшись в приложение для Android, создайте класс с именем Config.java и вставьте следующее.

package com.echessa.videotube; /** * Created by echessa on 1/13/17. */ public final class Config { private Config () { } public static final String YOUTUBE_API_KEY = "YOUR API KEY" ; } 

Вставьте в свой ключ API.

Загрузите последнюю версию API YouTube Android Player (1.2.2 на момент написания). Разархивируйте загруженный файл, чтобы найти файл библиотеки jar и пример приложения, которое вы можете использовать, чтобы увидеть, что предлагает библиотека. Файл jar находится в папке libs . Скопируйте и вставьте его в папку libs вашего проекта. Чтобы получить доступ к папке libs , используйте проекцию Project в Android Studio Project Explorer. Затем разверните VideoTube -> app -> libs .

Project Explorer

Вернитесь в перспективу Android, выберите файл build.gradle (Module: app) и добавьте следующее в зависимости.

 compile files( 'libs/YouTubeAndroidPlayerApi.jar' ) 

Синхронизируйте файлы проекта Gradle.

Добавьте следующее разрешение для доступа в Интернет к файлу AndroidManifest.xml в качестве дочернего элемента тега manifest и родственного элемента для application .

 < uses-permission android:name = "android.permission.INTERNET" /> 

Отредактируйте файл strings.xml, как показано. Это все строковые ресурсы, которые нам потребуются.

 < resources > < string name = "app_name" > VideoTube </ string > < string name = "player_error" > Error initializing YouTube player: %s </ string > < string name = "seek_to" > Jump To </ string > < string name = "seek_to_hint" > Seconds </ string > </ resources > 

Далее мы добавим YouTubePlayerView в файл макета. Этот вид используется для отображения видео на YouTube.

Модифицируйте 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" tools:context = ".MainActivity" > < com.google.android.youtube.player.YouTubePlayerView android:id = "@+id/youtube_view" android:layout_width = "match_parent" android:layout_height = "wrap_content" /> </ RelativeLayout > 

Мы будем использовать YouTubePlayerView непосредственно в нашей деятельности, а не использовать YouTubePlayerFragment . Из-за этого активность должна расширять класс YouTubeBaseActivity .

Измените MainActivity.java, как показано.

 package com.echessa.videotube; import android.content.Intent; import android.os.Bundle; import android.widget.Toast; import com.google.android.youtube.player.YouTubeBaseActivity; import com.google.android.youtube.player.YouTubeInitializationResult; import com.google.android.youtube.player.YouTubePlayer; import com.google.android.youtube.player.YouTubePlayer.Provider; import com.google.android.youtube.player.YouTubePlayerView; public class MainActivity extends YouTubeBaseActivity implements YouTubePlayer . OnInitializedListener { private static final int RECOVERY_REQUEST = 1 ; private YouTubePlayerView youTubeView; @Override protected void onCreate (Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); youTubeView = (YouTubePlayerView) findViewById(R.id.youtube_view); youTubeView.initialize(Config.YOUTUBE_API_KEY, this ); } @Override public void onInitializationSuccess (Provider provider, YouTubePlayer player, boolean wasRestored) { if (!wasRestored) { player.cueVideo( "fhWaJi1Hsfo" ); // Plays https://www.youtube.com/watch?v=fhWaJi1Hsfo } } @Override public void onInitializationFailure (Provider provider, YouTubeInitializationResult errorReason) { if (errorReason.isUserRecoverableError()) { errorReason.getErrorDialog( this , RECOVERY_REQUEST).show(); } else { String error = String.format(getString(R.string.player_error), errorReason.toString()); Toast.makeText( this , error, Toast.LENGTH_LONG).show(); } } @Override protected void onActivityResult ( int requestCode, int resultCode, Intent data) { if (requestCode == RECOVERY_REQUEST) { // Retry initialization if user performed a recovery action getYouTubePlayerProvider().initialize(Config.YOUTUBE_API_KEY, this ); } } protected Provider getYouTubePlayerProvider () { return youTubeView; } } 

В приведенном выше коде мы создали класс, который является подклассом YouTubeBaseActivity . Это необходимо для использования YouTubePlayerView . Мы реализовали YouTubePlayer.OnInitializedListener чтобы прослушивать успех или неудачу инициализации. Интерфейс имеет два метода, названных onInitializationFailure() и onInitializationSuccess() . Если инициализация прошла успешно, метод cueVideo() воспроизводит видео с YouTube и в случае сбоя проверяет, можно ли cueVideo() ошибку с помощью действий пользователя.

Если это не так, то пользователю показывается тост ошибки, а если он может быть восстановлен пользователем, то метод getErrorDialog() отображает диалоговое окно, которое позволит пользователю восстановиться после ошибки.

Например, если приложение YouTube не установлено на устройстве пользователя или устарело, в диалоговом окне появится приглашение, которое после подтверждения откроет магазин Google Play для пользователя, чтобы установить или обновить его соответствующим образом. Если приложение YouTube на устройстве отключено, то в подсказке откроются Системные настройки, чтобы пользователь мог включить его.

Когда пользователь возвращается из диалогового окна восстановления после ошибки, onActivityResult() , чтобы проверить, выполнил ли пользователь действие по восстановлению. Если это так, мы повторяем инициализацию.

Запустите приложение, и вы сможете воспроизвести видео, указанное в коде.

Замечания:

Вам нужно приложение YouTube на вашем устройстве для воспроизведения видео. Клиентская библиотека API взаимодействует со службой, которая распространяется как часть приложения YouTube для платформы Android. Пользователям необходимо запустить версию 4.2.16 мобильного приложения YouTube (или выше), чтобы использовать API. Как правило, устройства под управлением Android 2.2 (Froyo) или более поздней версии, на которых установлено приложение Google Play Store, должны иметь возможность использовать последнюю версию приложения YouTube.

YouTube Player

Реагирование на события воспроизведения и изменения состояния

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

YouTubePlayer имеет следующие определения интерфейса для прослушивания таких событий:
YouTubePlayer.PlayerStateChangeListener — Определение интерфейса для обратных вызовов, которые вызываются при изменении состояния проигрывателя высокого уровня.
YouTubePlayer.PlaybackEventListener — Определение интерфейса для обратных вызовов, которые вызываются при возникновении событий воспроизведения видео.
YouTubePlayer.OnFullscreenListener — определение интерфейса для обратных вызовов, которые вызываются, когда проигрыватель переключается между полноэкранным режимом включения или выключения, либо из-за нажатия пользователем кнопки полноэкранного setFullscreen(boolean) , либо из-за вызова setFullscreen(boolean) .
YouTubePlayer.PlaylistEventListener — определение интерфейса для обратных вызовов, которые вызываются при возникновении событий, связанных со списками воспроизведения.

Мы рассмотрим первые два для этого приложения.

Добавьте следующий метод в класс MainActivity .

 private void showMessage (String message) { Toast.makeText( this , message, Toast.LENGTH_LONG).show(); } 

Это создаст Toast с сообщением, переданным в функцию. Это избавит нас от написания похожих строк кода.

Затем добавьте следующие два подкласса в класс MainActivity .

 private final class MyPlaybackEventListener implements YouTubePlayer . PlaybackEventListener { @Override public void onPlaying () { // Called when playback starts, either due to user action or call to play(). showMessage( "Playing" ); } @Override public void onPaused () { // Called when playback is paused, either due to user action or call to pause(). showMessage( "Paused" ); } @Override public void onStopped () { // Called when playback stops for a reason other than being paused. showMessage( "Stopped" ); } @Override public void onBuffering ( boolean b) { // Called when buffering starts or ends. } @Override public void onSeekTo ( int i) { // Called when a jump in playback position occurs, either // due to user scrubbing or call to seekRelativeMillis() or seekToMillis() } } private final class MyPlayerStateChangeListener implements YouTubePlayer . PlayerStateChangeListener { @Override public void onLoading () { // Called when the player is loading a video // At this point, it's not ready to accept commands affecting playback such as play() or pause() } @Override public void onLoaded (String s) { // Called when a video is done loading. // Playback methods such as play(), pause() or seekToMillis(int) may be called after this callback. } @Override public void onAdStarted () { // Called when playback of an advertisement starts. } @Override public void onVideoStarted () { // Called when playback of the video starts. } @Override public void onVideoEnded () { // Called when the video reaches its end. } @Override public void onError (YouTubePlayer.ErrorReason errorReason) { // Called when an error occurs. } } 

Выше создаются классы, которые реализуют интерфейсы YouTubePlayer.PlaybackEventListener и YouTubePlayer.PlayerStateChangeListener . Для каждого класса я реализовал методы интерфейса и добавил комментарий о том, когда вызывается обратный вызов. Вы можете выполнять любые действия, которые вы хотите в каждом обратном вызове. В нашем примере я включил вывод Toast для onPlaying() , onPaused() и onStopped() которые будут выводить сообщение при возникновении события.

Добавьте следующие переменные класса в файл MainActivity .

 private MyPlayerStateChangeListener playerStateChangeListener; private MyPlaybackEventListener playbackEventListener; 

Добавьте следующее в onCreate() для инициализации вышеуказанных объектов.

 playerStateChangeListener = new MyPlayerStateChangeListener(); playbackEventListener = new MyPlaybackEventListener(); 

Измените onInitializationSuccess() как показано. Это устанавливает слушателей на объекте YouTubePlayer .

 @Override public void onInitializationSuccess (Provider provider, YouTubePlayer player, boolean wasRestored) { player.setPlayerStateChangeListener(playerStateChangeListener); player.setPlaybackEventListener(playbackEventListener); if (!wasRestored) { player.cueVideo( "fhWaJi1Hsfo" ); // Plays https://www.youtube.com/watch?v=fhWaJi1Hsfo } } 

Запустите приложение, и вы увидите различные всплывающие сообщения, когда вы начинаете воспроизведение видео, когда вы приостанавливаете его и когда оно останавливается (по причине, отличной от приостановки, например, завершение видео или ошибка воспроизведения).

Пользовательские элементы управления плеером

Библиотека YouTube делает хорошую работу по созданию удобного в использовании пользовательского интерфейса для воспроизведения видео на YouTube. Как разработчик, вы можете пойти дальше и предоставить пользовательские элементы управления, которые дадут пользователю больший контроль над воспроизведением. Например, разрешите им переходить вперед и назад в видео или разрешите им воспроизводить следующее или предыдущее видео в списке воспроизведения.

Мы создадим элемент управления в нашем приложении, который позволит пользователю переходить к определенному времени в видео.

API предоставляет два метода для быстрого воспроизведения:
seekToMillis() — ищет указанное время в видео.
seekRelativeMillis() — Поиск вперед или назад на указанное количество секунд.

Мы будем использовать первый, чтобы перейти к указанному времени в видео.

Модифицируйте Activity_main.xml как показано.

 <?xml version="1.0" encoding="utf-8"?> < LinearLayout 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:orientation = "vertical" tools:context = ".MainActivity" > < com.google.android.youtube.player.YouTubePlayerView android:id = "@+id/youtube_view" android:layout_width = "match_parent" android:layout_height = "wrap_content" /> < LinearLayout android:layout_width = "match_parent" android:layout_height = "wrap_content" > < EditText android:id = "@+id/seek_to_text" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:inputType = "number" android:hint = "@string/seek_to_hint" /> < Button android:id = "@+id/seek_to_button" android:text = "@string/seek_to" android:layout_width = "wrap_content" android:layout_height = "wrap_content" /> </ LinearLayout > </ LinearLayout > 

В MainActivity добавьте следующую переменную класса.

 private YouTubePlayer player; 

В начале onInitializationSuccess() установите эту переменную.

 this .player = player; 

Добавьте следующее в onCreate() .

 final EditText seekToText = (EditText) findViewById(R.id.seek_to_text); Button seekToButton = (Button) findViewById(R.id.seek_to_button); seekToButton.setOnClickListener( new View.OnClickListener() { @Override public void onClick (View v) { int skipToSecs = Integer.valueOf(seekToText.getText().toString()); player.seekToMillis(skipToSecs * 1000 ); } }); 

Запустите приложение, и вы сможете ввести число (в секундах) и пропустить видео до этой точки. Если вы введете число, превышающее продолжительность видео, видео будет пропущено до конца.

YouTube Player

Вывод

В этом уроке мы рассмотрели, как встроить проигрыватель YouTube в ваше приложение. Это удобно, если вы хотите, чтобы пользователи вашего приложения могли воспроизводить видео YouTube, оставаясь в своем приложении, вместо того, чтобы открывать приложение YouTube для воспроизведения видео, а затем пользователь возвращается к вашему приложению после воспроизведения.

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

Вы можете скачать готовый проект здесь . Не забудьте поместить свой ключ в файл Config.java .

Я хотел бы услышать, попробуете ли вы учебник, свой опыт и любые вопросы, которые у вас могут возникнуть.