Разработка видеоплеера для Android

This post is also available in: Английский

Android Video Player

Одна из задач, с которой вы можете столкнуться http://kakielekarstva.ru/  при разработке приложения для Android — это встраивание видео плеера в приложение, для воспроизведения видео контента. Стандартный SDK предоставляет два пути решения этой проблемы: использовать низкоуровневый класс MediaPlayer или готовый визуальный компонент VideoView совместно со стандартной панелью управления воспроизведением MediaController. Оба эти подхода обладают своими недостатками, поэтому мы решили разработать собственный видеокомпонент AVideo. В этой статье мы расскажем о том как его использовать в своем приложении и какие преимущества он дает.

Сначала немного о недостатках стандартных классов. Класс MediaPlayer в силу своей низкоуровневости обладает максимальными возможностями, но весьма сложен в использовании, поэтому его не рекомендуется использовать напрямую. Специально для того, чтобы спрятать от разработчика всю сложность MediaPlayer, в SDK входит класс VideoView. Простейшая программа, использующая VideoView и MediaController выглядит примерно так:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    mVideo = (VideoView) findViewById(R.id.videoView);
    MediaController controller = new MediaController(this);
    mVideo.setMediaController(controller);
    mVideo.setVideoURI(Uri.parse(STREAM_URL));
    mVideo.start();
}

Но класс VideoView подходит только для простейших применений. Если вы захотите добавить в него какую-либо новую функциональность или даже просто сменить оформление элементов панели управления, то сделать это будет не просто, поскольку в SDK не предусмотрено такой возможности. Разработчику остается только реализовать собственный компонент на основе MediaPlayer с нуля или вырезать из находящихся в открытом доступе исходных кодов Android нужные компоненты и внести в них необходимые изменения. Именно так мы и решили поступить при разработке собственного плеера AVideo. В результате получился набор видео классов, совместимых по интерфейсу со стандартными, но реализующий дополнительно следующую функциональность:

  • Измененное оформление элементов панели управления воспроизведением видео.
  • Управление уровнем звука и кнопка выключения звука.
  • Управление уровнем яркости подсветки экрана.
  • Корректная работа компонента и контролов при встраивании в сложный layout, когда видео занимает только часть экрана.
  • Переключение между обычным режимом отображения в layout-е и полноэкранным режимом по двойному нажатию на плеер с изменением размера элементов панели управления.
  • Остановка воспроизведения и восстановление воспроизведения с запомненной позиции при отключении экрана устройства и при выходе из приложения.

Использовать наши видео компоненты в собственном приложении очень просто. Загрузите архив, содержащий код компонентов и пример использования, с сайта github.com. Импортируйте проекты из архива в рабочую область Eclipse и подключите их к своему приложению как библиотеки (Свойства проекта, Android, Library, Add…). Код простейшего видеоплеера с использованием этих компонентов получится абсолютно такой же, как если бы вы использовали стандартные компоненты, единственное, что изменится — это строки импорта соответствующих классов и к названию компонента VideoView в файле layout-а добавится наш package

1
ru.denivip.android.video

. Пример простейшего layout-а будет выглядеть так:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:id="@+id/videoContainer"
       android:layout_width="wrap_content"
       android:layout_height="match_parent"
       android:layout_weight="10">

        <ru.denivip.android.video.VideoView
           xmlns:android="http://schemas.android.com/apk/res/android"
           android:id="@+id/videoView" android:layout_width="match_parent"
           android:layout_height="match_parent">
        </ru.denivip.android.video.VideoView>

    </FrameLayout>

Кроме того, для корректного восстановления позиции воспроизведения при выходе из приложения или при повороте экрана, рекомендуется также добавить свойство

1
android:configChanges="orientation"

к вашей activity и следующий Java-код:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Override
protected void onPause() {
    super.onPause();
    mVideo.suspend();
}

@Override
protected void onResume() {
    super.onResume();
    mVideo.resume();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
}

Результат работы тестового приложения в обычном и в полноэкранном режиме вы можете видеть на скриншотах:

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