Um app que reproduz mídia exige componentes de interface do usuário para exibir mídia e controlar a reprodução. A biblioteca Media3 inclui um módulo de IU que contém diversos componentes de IU. Para depender do módulo de interface, adicione o seguinte dependência:
implementation("androidx.media3:media3-ui:1.5.1")
implementation "androidx.media3:media3-ui:1.5.1"
O componente mais importante é PlayerView
, uma visualização para reprodução de mídia.
O PlayerView
exibe vídeo, imagens, legendas e capa do álbum durante a reprodução,
e os controles de mídia.
O PlayerView
tem um método setPlayer
para anexar e desconectar (transmitindo
null
) instâncias de jogadores.
PlayerView
O PlayerView
pode ser usado para reprodução de vídeo, imagem e áudio. Ele renderiza
vídeo e legendas no caso de reprodução de vídeo, bitmaps para reprodução de imagens
e pode exibir artes incluídas como metadados em arquivos de áudio. É possível incluí-lo
nos arquivos de layout como qualquer outro componente de interface. Por exemplo, uma PlayerView
podem ser incluídas com o seguinte XML:
<androidx.media3.ui.PlayerView
android:id="@+id/player_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:show_buffering="when_playing"
app:show_shuffle_button="true"/>
O snippet acima ilustra que PlayerView
fornece várias
atributos. Esses atributos podem ser usados para personalizar o comportamento da visualização, como
e sua aparência. A maioria desses atributos tem setter correspondente
, que podem ser usados para personalizar a visualização no tempo de execução. O
Javadoc PlayerView
lista esses atributos e métodos de definição com
mais detalhes.
Depois que a visualização é declarada no arquivo de layout, ela pode ser pesquisada no
método onCreate
da atividade:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // ... playerView = findViewById(R.id.player_view) }
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // ... playerView = findViewById(R.id.player_view); }
Quando um player for inicializado, ele poderá ser anexado à visualização chamando
setPlayer
:
// Instantiate the player. val player = ExoPlayer.Builder(context).build() // Attach player to the view. playerView.player = player // Set the media item to be played. player.setMediaItem(mediaItem) // Prepare the player. player.prepare()
// Instantiate the player. player = new ExoPlayer.Builder(context).build(); // Attach player to the view. playerView.setPlayer(player); // Set the media item to be played. player.setMediaItem(mediaItem); // Prepare the player. player.prepare();
Escolher um tipo de plataforma
O atributo surface_type
de PlayerView
permite definir o tipo de superfície
usado para a reprodução de vídeo. Além dos valores spherical_gl_surface_view
(que
é um valor especial para a reprodução de vídeo esférica) e
video_decoder_gl_surface_view
(que é para renderização de vídeo usando renderizadores
de extensão), os valores permitidos são surface_view
, texture_view
e none
. Se
a visualização for apenas para reprodução de áudio, use none
para evitar a necessidade de
criar uma superfície, porque isso pode ser caro.
Se a visualização for para reprodução de vídeo normal, use surface_view
ou texture_view
. O SurfaceView
tem vários benefícios em relação ao TextureView
para
reprodução de vídeo:
- Energia significativamente menor e consumo em vários dispositivos.
- Tempo de frame mais preciso, resultando em uma reprodução de vídeo mais suave.
- Suporte para saída de vídeo HDR de maior qualidade em dispositivos compatíveis.
- Suporte para saída segura ao reproduzir conteúdo protegido por DRM.
- A capacidade de renderizar conteúdo de vídeo em resolução máxima da tela no Dispositivos Android TV que aprimoram a camada da interface.
Portanto, dê preferência a SurfaceView
em vez de TextureView
sempre que possível.
TextureView
só será usado se SurfaceView
não atender às suas necessidades. Um
exemplo é quando animações suaves ou rolagem da superfície do vídeo são necessárias
antes do Android 7.0 (nível 24 da API), conforme descrito nas notas a seguir. Nesse
caso, é preferível usar TextureView
somente quando SDK_INT
for menor
que 24 (Android 7.0) e SurfaceView
, caso contrário.
Navegação com D-pad no Android TV
O controle remoto do Android TV tem um botão direcional que envia comandos que
chegar como evento principal a dispatchKeyEvent(KeyEvent)
dos seus Activity
. Esses
precisam ser delegadas à visualização do player:
override fun dispatchKeyEvent(event: KeyEvent?): Boolean{ return playerView.dispatchKeyEvent(event!!) || super.dispatchKeyEvent(event) }
@Override public boolean dispatchKeyEvent(KeyEvent event) { return playerView.dispatchKeyEvent(event) || super.dispatchKeyEvent(event); }
Solicitar o foco para a visualização do player é importante para navegar pelos controles
de reprodução e pular anúncios. Considere solicitar o foco em onCreate
do
Activity
:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // ... playerView.requestFocus() // ... }
@Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // ... playerView.requestFocus(); // ... }
Se você estiver usando o Compose no Android TV, será necessário tornar AndroidView
focalizável e delegue o evento transmitindo o parâmetro modificador para o objeto
AndroidView
de acordo:
AndroidView(
modifier = modifier
.focusable()
.onKeyEvent { playerView.dispatchKeyEvent(it.nativeKeyEvent) },
factory = { playerView }
)
Substituir drawables
PlayerView
usa PlayerControlView
para mostrar os controles
de reprodução e a barra de progresso. Os drawables usados por PlayerControlView
podem
ser substituídos por drawables com os mesmos nomes definidos no aplicativo. Consulte
o Javadoc PlayerControlView
para uma lista de drawables de controle que
podem ser substituídas.
Outras personalizações
Quando a personalização além da descrita acima for necessária, esperamos que os desenvolvedores de apps implementem os próprios componentes de interface em vez de usar os fornecidos pelo módulo de interface do Media3.