こちらを参考にしました。
ExoPlayer を使用したメディア ストリーミング
プロジェクトの作成
プロジェクト名: exo01
環境
インターネットに接続する
AndroidManifest.xml
(省略)
<uses-permission android:name="android.permission.INTERNET" />
(省略)
app/build.gradle.kts
android {
(省略)
buildFeatures {
viewBinding = true
}
}
(省略)
dependencies {
(省略)
val mediaVersion = "1.1.1"
implementation("androidx.media3:media3-exoplayer:$mediaVersion")
implementation("androidx.media3:media3-ui:$mediaVersion")
implementation("androidx.media3:media3-exoplayer-dash:$mediaVersion")
}
values/strings.xml
<resources>
<string name="app_name">exo01</string>
<string name="media_url_mp3">https://storage.googleapis.com/exoplayer-test-media-0/Jazz_In_Paris.mp3</string>
<string name="media_url_mp4">https://storage.googleapis.com/exoplayer-test-media-0/BigBuckBunny_320x180.mp4</string>
</resources>
画面
activity_main.xml は削除します。
layout/activity_player.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000000">
<androidx.media3.ui.PlayerView
android:id="@+id/video_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</FrameLayout>
プログラム
MainActivity.kt
package com.example.exo01
import android.annotation.SuppressLint
import android.os.Build
import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.media3.common.MediaItem
import androidx.media3.common.Player
import androidx.media3.exoplayer.ExoPlayer
import com.example.exo01.databinding.ActivityPlayerBinding
/**
* A fullscreen activity to play audio or video streams.
*/
class MainActivity : AppCompatActivity() {
private var player: Player? = null
private var playWhenReady = true
private var currentWindow = 0
private var playbackPosition = 0L
private val viewBinding by lazy(LazyThreadSafetyMode.NONE) {
ActivityPlayerBinding.inflate(layoutInflater)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(viewBinding.root)
println("*** onCreate *** aaa ***")
}
private fun initializePlayer() {
player = ExoPlayer.Builder(this)
.build()
.also { exoPlayer ->
viewBinding.videoView.player = exoPlayer
val mediaItem = MediaItem.fromUri(getString(R.string.media_url_mp4))
println("*** initializePlayer *** aaa ***")
exoPlayer.setMediaItem(mediaItem)
println("*** initializePlayer *** ccc ***")
exoPlayer.playWhenReady = playWhenReady
exoPlayer.seekTo(currentWindow, playbackPosition)
exoPlayer.prepare()
}
}
public override fun onStart() {
println("*** onStart *** aaa ***")
super.onStart()
if (Build.VERSION.SDK_INT > 23) {
initializePlayer()
}
}
public override fun onResume() {
super.onResume()
hideSystemUi()
if (Build.VERSION.SDK_INT <= 23 || player == null) {
initializePlayer()
}
}
public override fun onPause() {
super.onPause()
if (Build.VERSION.SDK_INT <= 23) {
releasePlayer()
}
}
public override fun onStop() {
super.onStop()
if (Build.VERSION.SDK_INT > 23) {
releasePlayer()
}
}
@SuppressLint("InlinedApi")
private fun hideSystemUi() {
viewBinding.videoView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LOW_PROFILE
or View.SYSTEM_UI_FLAG_FULLSCREEN
or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION)
}
private fun releasePlayer() {
player?.run {
playbackPosition = this.currentPosition
currentWindow = this.currentWindowIndex
playWhenReady = this.playWhenReady
release()
}
player = null
}
}
次は、自動で挿入されます。
import com.example.exo01.databinding.ActivityPlayerBinding