Чтобы создать видеоплеер в Jetpack Compose, я использую ExoPlayer2. Проблема в следующем - есть экран 1, на котором находится видеоплеер, и экран 2. При переключении с экрана 1 на экран 2 экран видеоплеера отображается на экране 2 примерно секунду и только потом пропадает.
Подскажите, в чем может быть причина?
@Composable
internal fun ShowAboutCorpScreen() {
val state = localStateEventEffectModel.current.state
Scaffold(
topBar = {},
) { contentPadding ->
Column(
modifier = Modifier
.padding(contentPadding)
.fillMaxSize()
.background(SynergyTheme.colors.bgPrimary)
.verticalScroll(rememberScrollState()),
) {
state.aboutCorpData?.sections?.forEach {
SectionType.entries.find { a -> a.name == it.code.uppercase() }?.let { type ->
when (type) {
SectionType.DESCRIPTION -> BlockDescription(model = it)
else -> {}
}
}
}
}
}
}
@Composable
internal fun BlockDescription(model: SectionAboutModel) {
Column(
modifier = Modifier
.padding(horizontal = SynergyTheme.dimensions.x4)
.padding(top = SynergyTheme.dimensions.x6),
) {
Text(
text = model.title,
style = SynergyTheme.typography.textSemibold.copy(
fontSize = Constants.fontsize.f22,
lineHeight = Constants.fontsize.f28,
),
color = colorResource(id = UIStyleR.color.textPrimary),
)
VideoPlayer(model.video)
Text(
modifier = Modifier.padding(top = SynergyTheme.dimensions.x2_5),
text = model.text,
style = SynergyTheme.typography.text1Medium,
lineHeight = Constants.fontsize.f22,
color = colorResource(id = UIStyleR.color.textPrimary),
)
}
}
@Composable
private fun VideoPlayer(videoUrl: String) {
val context = LocalContext.current
var isPlaying by remember { mutableStateOf(false) }
val videoUri = Uri.parse(videoUrl)
val cacheDataSource = CacheDataSourceFactory().createCacheDataSource()
val exoPlayer = remember {
ExoPlayer.Builder(context).build().apply {
val mediaSource = ProgressiveMediaSource.Factory(cacheDataSource)
.createMediaSource(MediaItem.fromUri(videoUri))
setMediaSource(mediaSource)
playWhenReady = false
prepare()
}
}
LaunchedEffect(isPlaying) {
if (isPlaying) {
exoPlayer.seekToDefaultPosition()
exoPlayer.play()
} else {
exoPlayer.pause()
}
}
if (isPlaying) {
Box(
modifier = Modifier
.height(Constants.dimensions.d220)
.padding(vertical = SynergyTheme.dimensions.x2_5)
.clip(SynergyTheme.shapes.medium),
) {
ExoPlayerLifecycleOwner(exoPlayer)
}
} else {
Box {
ImageFromSource(
iconSource = IconSource.FromResource(
resourceId = R.drawable.about_synergy,
contentDescription = null,
),
modifier = Modifier
.fillMaxWidth()
.padding(vertical = SynergyTheme.dimensions.x2_5)
.clip(SynergyTheme.shapes.medium),
contentScale = ContentScale.FillWidth,
)
Image(
modifier = Modifier
.size(Constants.dimensions.d56)
.align(Alignment.Center)
.clickable { isPlaying = true },
painter = painterResource(id = R.drawable.about_play_video),
contentDescription = null,
contentScale = ContentScale.Crop,
)
}
}
}
@Composable
internal fun ExoPlayerLifecycleOwner(exoPlayer: ExoPlayer) {
val lifecycleOwner = rememberUpdatedState(LocalLifecycleOwner.current)
val context = LocalContext.current
DisposableEffect(
key1 = AndroidView(
modifier = Modifier.fillMaxSize(),
factory = {
StyledPlayerView(context).apply {
resizeMode = AspectRatioFrameLayout.RESIZE_MODE_FIT
player = exoPlayer
}
},
),
effect = {
val observer = LifecycleEventObserver { _, event ->
when (event) {
Lifecycle.Event.ON_RESUME -> {
exoPlayer.play()
}
Lifecycle.Event.ON_PAUSE -> {
exoPlayer.stop()
}
else -> {}
}
}
val lifecycle = lifecycleOwner.value.lifecycle
lifecycle.addObserver(observer)
onDispose {
exoPlayer.release()
lifecycle.removeObserver(observer)
}
},
)
}
Подробнее здесь: https://stackoverflow.com/questions/787 ... the-screen
Составление Jetpack, ExoPlayer поздно уничтожается при смене экрана ⇐ Android
Форум для тех, кто программирует под Android
-
Anonymous
1728546007
Anonymous
Чтобы создать видеоплеер в Jetpack Compose, я использую ExoPlayer2. Проблема в следующем - есть экран 1, на котором находится видеоплеер, и экран 2. При переключении с экрана 1 на экран 2 экран видеоплеера отображается на экране 2 примерно секунду и только потом пропадает.
Подскажите, в чем может быть причина?
@Composable
internal fun ShowAboutCorpScreen() {
val state = localStateEventEffectModel.current.state
Scaffold(
topBar = {},
) { contentPadding ->
Column(
modifier = Modifier
.padding(contentPadding)
.fillMaxSize()
.background(SynergyTheme.colors.bgPrimary)
.verticalScroll(rememberScrollState()),
) {
state.aboutCorpData?.sections?.forEach {
SectionType.entries.find { a -> a.name == it.code.uppercase() }?.let { type ->
when (type) {
SectionType.DESCRIPTION -> BlockDescription(model = it)
else -> {}
}
}
}
}
}
}
@Composable
internal fun BlockDescription(model: SectionAboutModel) {
Column(
modifier = Modifier
.padding(horizontal = SynergyTheme.dimensions.x4)
.padding(top = SynergyTheme.dimensions.x6),
) {
Text(
text = model.title,
style = SynergyTheme.typography.textSemibold.copy(
fontSize = Constants.fontsize.f22,
lineHeight = Constants.fontsize.f28,
),
color = colorResource(id = UIStyleR.color.textPrimary),
)
VideoPlayer(model.video)
Text(
modifier = Modifier.padding(top = SynergyTheme.dimensions.x2_5),
text = model.text,
style = SynergyTheme.typography.text1Medium,
lineHeight = Constants.fontsize.f22,
color = colorResource(id = UIStyleR.color.textPrimary),
)
}
}
@Composable
private fun VideoPlayer(videoUrl: String) {
val context = LocalContext.current
var isPlaying by remember { mutableStateOf(false) }
val videoUri = Uri.parse(videoUrl)
val cacheDataSource = CacheDataSourceFactory().createCacheDataSource()
val exoPlayer = remember {
ExoPlayer.Builder(context).build().apply {
val mediaSource = ProgressiveMediaSource.Factory(cacheDataSource)
.createMediaSource(MediaItem.fromUri(videoUri))
setMediaSource(mediaSource)
playWhenReady = false
prepare()
}
}
LaunchedEffect(isPlaying) {
if (isPlaying) {
exoPlayer.seekToDefaultPosition()
exoPlayer.play()
} else {
exoPlayer.pause()
}
}
if (isPlaying) {
Box(
modifier = Modifier
.height(Constants.dimensions.d220)
.padding(vertical = SynergyTheme.dimensions.x2_5)
.clip(SynergyTheme.shapes.medium),
) {
ExoPlayerLifecycleOwner(exoPlayer)
}
} else {
Box {
ImageFromSource(
iconSource = IconSource.FromResource(
resourceId = R.drawable.about_synergy,
contentDescription = null,
),
modifier = Modifier
.fillMaxWidth()
.padding(vertical = SynergyTheme.dimensions.x2_5)
.clip(SynergyTheme.shapes.medium),
contentScale = ContentScale.FillWidth,
)
Image(
modifier = Modifier
.size(Constants.dimensions.d56)
.align(Alignment.Center)
.clickable { isPlaying = true },
painter = painterResource(id = R.drawable.about_play_video),
contentDescription = null,
contentScale = ContentScale.Crop,
)
}
}
}
@Composable
internal fun ExoPlayerLifecycleOwner(exoPlayer: ExoPlayer) {
val lifecycleOwner = rememberUpdatedState(LocalLifecycleOwner.current)
val context = LocalContext.current
DisposableEffect(
key1 = AndroidView(
modifier = Modifier.fillMaxSize(),
factory = {
StyledPlayerView(context).apply {
resizeMode = AspectRatioFrameLayout.RESIZE_MODE_FIT
player = exoPlayer
}
},
),
effect = {
val observer = LifecycleEventObserver { _, event ->
when (event) {
Lifecycle.Event.ON_RESUME -> {
exoPlayer.play()
}
Lifecycle.Event.ON_PAUSE -> {
exoPlayer.stop()
}
else -> {}
}
}
val lifecycle = lifecycleOwner.value.lifecycle
lifecycle.addObserver(observer)
onDispose {
exoPlayer.release()
lifecycle.removeObserver(observer)
}
},
)
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78711738/jetpack-compose-exoplayer-is-destroyed-late-when-changing-the-screen[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия