Робота з відео
У стандартному наборі віджетів Android визначений клас VideoView, який дозволяє відтворювати відео.
Які типи відеофайлів можна використовувати?
Android підтримує більшість поширених типів відеофайлів, зокрема:
- 3GPP (.3gp)
- WebM (.webm)
- Matroska (.mkv)
- MPEG-4 (.mp4)
VideoView може працювати як із відеороликами, розміщеними на мобільному пристрої, так і з відеоматеріалами із мережі.
Використання локального відео
У даному прикладі використовується відеоролик, розміщений локально. Для цього додаємо відеофайл до проєкту.
Додавання відеофайлу до проєкту
Зазвичай відеоматеріали розміщують у папці 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
За допомогою класу 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() передати інтернет-адресу відтворюваного файлу.