gpt4 book ai didi

Android MVVM - 在哪里绑定(bind)到 Mediaplayer 绑定(bind)服务?

转载 作者:行者123 更新时间:2023-12-05 06:51:21 24 4
gpt4 key购买 nike

我有一个 Mediaplayer 和 MediaSession 的永久绑定(bind)服务。我正在使用 HILT 将我的应用程序重构为 MVVM 架构。

我想知道应该在哪里绑定(bind)服务以及在哪里保存 IBinder 和媒体 Controller :

  • 应用程序?
  • UI fragment 或 Activity ?
  • 共享 View 模型 ?
  • 存储库?
  • 其他地方?

使用存储库的困难在于它是从 HILT 模块注入(inject)到 View 模型中的。

如果您能提供一些指南,我们将不胜感激。

最佳答案

我设法将 MediaPlayer 注入(inject)到我的 View 模型中。

首先把它放到一个包装类中:

import android.content.Context
import android.media.MediaPlayer
import androidx.annotation.RawRes

class SoundPlayer(
private val context: Context,
) {
private var mediaPlayer = MediaPlayer().apply {
setOnPreparedListener { start() }
setOnCompletionListener { reset() }
}

fun reset() = mediaPlayer.reset()

fun playSound(@RawRes rawResId: Int) {
val assetFileDescriptor = context.resources.openRawResourceFd(rawResId) ?: return
mediaPlayer.run {
reset()
setDataSource(
assetFileDescriptor.fileDescriptor,
assetFileDescriptor.startOffset,
assetFileDescriptor.declaredLength
)
prepareAsync()
}
}
}

然后使用这个模块注入(inject)它:

@Module
@InstallIn(SingletonComponent::class)
class SoundPlayerModule {

@Provides
@Singleton
fun provideSoundPlayer(@ApplicationContext context: Context) =
SoundPlayer(context = context)
}

然后像这样在 ViewModel 中使用它,其中 R.raw.start 指的是位于 res/raw/start.mp3 的 MP3 文件

@HiltViewModel
class ExerciseViewModel @Inject constructor(
private var soundPlayer: SoundPlayer,
) : ViewModel() {
...
soundPlayer.playSound(R.raw.start)
...
}

关于Android MVVM - 在哪里绑定(bind)到 Mediaplayer 绑定(bind)服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66180256/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com