APUNTES ANDROID
  • Introducción
  • Apuntes Linux
  • Apuntes Red Team
  • Apuntes Blue Team
  • Apuntes Python
  • Ricardev github
  • Escribiendo tu primera App
    • Instalar Android Studio
    • Proyecto
    • Ejecutar una App
    • Anatomía del Proyecto
      • Gradle scripts
      • AndroidManifest.xml
      • Java
      • Res
    • Componentes de una App
      • Activities
      • Fragments
      • Views y ViewGroups
      • Services
      • Broadcast Receivers
      • Intents
      • Content Provider
      • Widgets
    • Paradigmas de diseño
      • Views
        • Pallete Texts
          • TextView
          • EditText
          • AutoCompleteTextView
        • Pallete Buttons
          • Button
          • ImageButton
          • Chip y ChipGroup
          • RadioButton y RadioGroup
          • CheckBox
          • ToggleButton
          • Switch
          • FloatingActionButton
        • Pallete Widgets
          • ImageView
          • ShapeableImageView
          • WebView
          • VideoView
          • CalendarView
          • ProgressBar
          • SeekBar
          • RatingBar
          • SearchView
          • Divider
        • Custom Views
        • View Binding
      • Jetpack Compose
    • Layouts
      • FrameLayout
      • Linear Layout
      • Relative Layout
      • Constraint Layout
      • Table Layout
      • Grid Layout
    • Containers
      • Spinner
      • RecyclerView
      • CardView
      • ScrollView y HorizontalScrollView
      • ViewPager2
      • AppBarLayout y BottomAppBar
      • NavigationView y BottomNavigationView
      • Toolbar y MaterialToolbar
      • TabLayout y TabItem
      • ViewStub
      • etiquetas <include> y <merge>
Powered by GitBook
On this page
  • DEFINICIÓN
  • Información técnica
  • USO DESDE XML
  • CONFIGURACIÓN
  • Video Online
  • Video Local
  • CODIGO
  1. Escribiendo tu primera App
  2. Paradigmas de diseño
  3. Views
  4. Pallete Widgets

VideoView

Explicación del concepto de VideoView.

PreviousWebViewNextCalendarView

Last updated 2 years ago

DEFINICIÓN

Hereda de SurfaceView.

Reproduce un archivo de video.

  • Una VideoView puede reproducir videos desde varias fuentes, desde resources hasta content providers.

  • Se encarga de controlar el tamaño del video, por lo que puede ser utilizada en cualquier tipo de layout.

  • Además ofrece opciones como escalado y tinte.

Información técnica

Esta información aparece en el enlace de arriba como información util.

En esta guía no la vamos a utilizar, sin embargo, se la dejo traducida para facilitarle la vida.

Estado

Una VideoView no mantiene su estado cuando pasa a segundo plano, en particular no almacena:

  • Posición de la reproducción actual.

  • Estado de la reproducción actual.

  • Pistas seleccionadas.

  • Subtitulos añadidos.

Audio

USO DESDE XML

activity_main.xml
<?xml version="1.0" encoding="utf-8"?>

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:layout_margin="15dp">
        <VideoView
            android:id="@+id/vvUrl"
            android:layout_width="match_parent"
            android:layout_height="400dp"
            android:layout_marginBottom="10dp"/>

        <View
            android:id="@+id/divider"
            android:layout_width="match_parent"
            android:layout_height="10dp"
            android:background="?android:attr/listDivider" />

        <VideoView
            android:id="@+id/vvProject"
            android:layout_width="match_parent"
            android:layout_height="400dp"
            android:layout_marginTop="10dp"
            android:layout_marginBottom="100dp"/>
    </LinearLayout>
</ScrollView>

No se muestra nada en las VideoViews por que es necesario configurar la VideoView antes de poder hacer uso de ella.

CONFIGURACIÓN

Vamos a diferenciar la configuración entre la reproducción de un video local y uno online.

Video Online

Solicitar permiso de Internet

En primer lugar se debe ir al AndroidManifest.xml y solicitar permisos para el uso de Internet. Esto se hace con la siguiente línea de código:

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

<application>
.....

Código en kotlin

Después de eso hay que realizar varios pasos en MainActivity.kt, concretamente dentro del OnCreate:

  • Primero creo una variable del tipo VideoView y la relaciono con el id de mi View:

val vvUrl: VideoView = findViewById(R.id.vvUrl)
  • Después creo una instancia de la clase MediaController() con el contexto definido en su constructor:

val mcUrl = MediaController(this)
  • Ahora relacionamos nuestro MediaController con nuestra View y viceversa:

mcUrl.setAnchorView(vvUrl)
vvUrl.setMediaController(mcUrl)
  • Por último le indicamos a nuestra VideoView el recurso que queremos reproducir:

vvUrl.setVideoPath("https://mivideodeejemplo.com")

Video Local

Para reproducir un recurso local los pasos son los mismos, lo único que cambia es el VideoPath del final:

val vvProject: VideoView = findViewById(R.id.vvProject)
val mcProject = MediaController(this)
val path = "android.resource://" + packageName + "/" + R.raw.vid_ejemplo

mcProject.setAnchorView(vvProject)
vvProject.setMediaController(mcProject)

vvProject.setVideoURI(Uri.parse(path))

CODIGO

Con todo hecho, el código nos quedaría de la siguiente manera:

activity_main.xml
<?xml version="1.0" encoding="utf-8"?>

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:layout_margin="15dp">
        <VideoView
            android:id="@+id/vvUrl"
            android:layout_width="match_parent"
            android:layout_height="400dp"
            android:layout_marginBottom="10dp"/>

        <View
            android:id="@+id/divider"
            android:layout_width="match_parent"
            android:layout_height="10dp"
            android:background="?android:attr/listDivider" />

        <VideoView
            android:id="@+id/vvProject"
            android:layout_width="match_parent"
            android:layout_height="400dp"
            android:layout_marginTop="10dp"
            android:layout_marginBottom="100dp"/>
    </LinearLayout>
</ScrollView>
MainActivity.kt
package com.example.android.appdeejemplo

import android.net.Uri
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.MediaController
import android.widget.VideoView

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val vvUrl: VideoView = findViewById(R.id.vvUrl)
        val mcUrl = MediaController(this)

        mcUrl.setAnchorView(vvUrl)
        vvUrl.setMediaController(mcUrl)

        vvUrl.setVideoPath("https://mivideodeejemplo.com")

        val vvProject: VideoView = findViewById(R.id.vvProject)
        val mcProject = MediaController(this)
        val path = "android.resource://" + packageName + "/" + R.raw.vid_ejemplo

        mcProject.setAnchorView(vvProject)
        vvProject.setMediaController(mcProject)

        vvProject.setVideoURI(Uri.parse(path))

    }
}

Las aplicaciones deben almacenar y luego recuperar estos datos en su propia y .

Tambien hay que tener en cuenta que el id de la sesión de audio (que se obtiene con ) puede cambiar después de restaurar el VideoView.

Por defecto, VideoView solicita el foco de audio con . Para cambiar este comportamiento debe utilizar .

Los atributos de audio utilizados por defecto son y . Para modificarlos utilice .

Activity.onSaveInstanceState(Bundle)
Activity.onRestoreInstanceState(Bundle)
getAudioSessionId()
AudioManager#AUDIOFOCUS_GAIN
setAudioFocusRequest(int)
AudioAttributes#USAGE_MEDIA
AudioAttributes#CONTENT_TYPE_MOVIE
setAudioAttributes(android.media.AudioAttributes)
VideoView  |  Android DevelopersAndroid Developers
Fuente: developer.android
Logo