Для работы с видеоматериалами в стандартном наборе виджетов Android определен класс VideoView, который позволяет воспроизводить видео.
Какие типы видеофайлов можно использовать? Android поддерживает большинство распространенных типов видеофайлов, в частности, 3GPP (.3gp), WebM (.webm), Matroska (.mkv), MPEG-4 (.mp4).
VideoView может работать как с роликами, размещенными на мобильном устройстве, так и с видеоматериалами из сети. В данном случае используем видеоролик, размещенный локально. Для этого добавим в проект какой-нибудь видеоролик. Обычно видеоматериалы помещают в проекте в папку res/raw. По умолчанию проект не содержит подобной папки, поэтому добавим в каталог res подпапку raw. Для этого нажмем на папку res правой кнопкой мыши и в появившемся меню выберем New -> Android Resource Directory:
Затем в появившемся окне в качестве типа папки укажем raw (что также будет использоваться в качестве названия папки):
После добавления папки raw скопируем в нее какой-нибудь видеофайл:
Теперь определим функционал для его воспроизведения. Для этого в файле activity_main.xml укажем следующий код:
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/playButton" android:layout_width="0dp" android:layout_height="wrap_content" android:text="Play" android:onClick="play" app:layout_constraintBottom_toTopOf="@id/videoPlayer" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toLeftOf="@id/pauseButton" app:layout_constraintTop_toTopOf="parent" /> <Button android:id="@+id/pauseButton" android:layout_width="0dp" android:layout_height="wrap_content" android:text="Pause" android:onClick="pause" app:layout_constraintBottom_toTopOf="@id/videoPlayer" app:layout_constraintLeft_toRightOf="@id/playButton" app:layout_constraintRight_toLeftOf="@id/stopButton" app:layout_constraintTop_toTopOf="parent"/> <Button android:id="@+id/stopButton" android:layout_width="0dp" android:layout_height="wrap_content" android:text="Stop" android:onClick="stop" app:layout_constraintBottom_toTopOf="@id/videoPlayer" app:layout_constraintLeft_toRightOf="@id/pauseButton" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> <VideoView android:id="@+id/videoPlayer" android:layout_height="0dp" android:layout_width="0dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@id/playButton"/> </androidx.constraintlayout.widget.ConstraintLayout>
Для управления воспроизведением видео здесь определены три кнопки: для запуска видео, для паузы и для его остановки.
И также изменим код MainActivity:
package com.example.mediaapp; import androidx.appcompat.app.AppCompatActivity; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.widget.VideoView; public class MainActivity extends AppCompatActivity { VideoView videoPlayer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); videoPlayer = findViewById(R.id.videoPlayer); Uri myVideoUri= Uri.parse( "android.resource://" + getPackageName() + "/" + R.raw.cats); videoPlayer.setVideoURI(myVideoUri); } public void play(View view){ videoPlayer.start(); } public void pause(View view){ videoPlayer.pause(); } public void stop(View view){ videoPlayer.stopPlayback(); videoPlayer.resume(); } }
Во-первых, чтобы управлять потоком воспроизведения, нам надо получить объект VideoView: videoPlayer = findViewById(R.id.videoPlayer);
Чтобы указать источник воспроизведения, необходим объект Uri. В данном случае с помощью выражения
Uri myVideoUri= Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.cats);
получаем адрес видеоролика внутри пакета приложения.
Строка URI имеет ряд частей: сначала идет Uri-схема
(http://
или как здесь android.resource://
),
затем название пакета, получаемое через метод getPackageName(), и далее непосредственно название ресурса видео из папки res/raw,
которое совпадает с названием файла.
Затем этот Uri устанавливается у videoPlayerа: videoPlayer.setVideoURI(myVideoUri);
Чтобы управлять видеопотоком, обработчики нажатия кнопок вызывают соответствующее действие:
public void play(View view){ videoPlayer.start(); } public void pause(View view){ videoPlayer.pause(); } public void stop(View view){ videoPlayer.stopPlayback(); videoPlayer.resume(); }
Метод videoPlayer.start()
начинает или продолжает воспроизведение.
Метод videoPlayer.pause()
приостанавливает видео.
Метод videoPlayer.stopPlayback()
полностью останавливает видео.
Метод videoPlayer.resume()
позволяет снова начать воспроизведение видео с начала после его полной остановки.
При запуске приложения мы сможем с помощью кнопок управляь воспроизведением:
С помощью класса MediaController мы можем добавить к VideoView дополнительно элементы управления. Для этого изменим код MainActivity:
package com.example.mediaapp; import androidx.appcompat.app.AppCompatActivity; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.widget.VideoView; import android.widget.MediaController; public class MainActivity extends AppCompatActivity { VideoView videoPlayer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); videoPlayer = findViewById(R.id.videoPlayer); Uri myVideoUri= Uri.parse( "android.resource://" + getPackageName() + "/" + R.raw.cats); videoPlayer.setVideoURI(myVideoUri); MediaController mediaController = new MediaController(this); videoPlayer.setMediaController(mediaController); mediaController.setMediaPlayer(videoPlayer); } public void play(View view){ videoPlayer.start(); } public void pause(View view){ videoPlayer.pause(); } public void stop(View view){ videoPlayer.stopPlayback(); videoPlayer.resume(); } }
И если мы запустим приложения, то при касании по VideoView внизу появятся инструменты для управления видео. В прицнипе теперь и кнопки, которые мы создали ранее, не нужны:
VideoView поддерживает воспроизведение файла из интернета. Но чтобы это стало возможно, необходимо в файле AndroidManifest.xml установить разрешение android.permission.INTERNET, так как мы получаем данные из интернета:
<uses-permission android:name="android.permission.INTERNET" />
Далее изменим класс MainActivity:
package com.example.mediaapp; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.VideoView; public class MainActivity extends AppCompatActivity { VideoView videoPlayer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); videoPlayer = findViewById(R.id.videoPlayer); videoPlayer.setVideoPath("http://techslides.com/demos/sample-videos/small.mp4"); } public void play(View view){ videoPlayer.start(); } public void pause(View view){ videoPlayer.pause(); } public void stop(View view){ videoPlayer.stopPlayback(); videoPlayer.resume(); } }
Здесь нам надо в метод videoPlayer.setVideoPath()
передать интернет-адрес воспроизводимого файла.