使用 Jetpack Compose 在 Android TV 上启用系统声音

Ker*_*ora 3 android android-tv android-jetpack android-jetpack-compose android-jetpack-compose-tv

你好 Stack Overflow 社区,

我目前正在使用 Jetpack Compose 开发 Android TV 应用程序,但遇到了一个我似乎无法找到解决方案的问题。

在传统的 Android 开发中,我可以轻松地使用 AudioManager 类来处理系统声音。然而,随着过渡到 Jetpack Compose,我不知道如何做同样的事情。

这是我在传统视图系统中使用的典型方法:

AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
audioManager.playSoundEffect(Sounds.DISMISS);
Run Code Online (Sandbox Code Playgroud)

如何在 Jetpack Compose 中实现同等功能?任何帮助将不胜感激。如果需要任何其他信息,我非常乐意提供。

先感谢您。

(它不起作用:)

<resources>
    <style name="Theme.xxx" parent="android:Theme.Material.Light.NoActionBar">
        <item name="android:soundEffectsEnabled">true</item>
    </style>
</resources>
Run Code Online (Sandbox Code Playgroud)

Vig*_*aut 5

当某个项目获得焦点时,您通常需要声音效果。因此,您可以创建如下所示的自定义修饰符来执行此操作。

@Composable
fun Modifier.playSoundEffectOnFocus(
    effectType: Int = AudioManager.FX_FOCUS_NAVIGATION_UP
): Modifier {
    val context = LocalContext.current
    val audioManager = remember {
        context.getSystemService(Context.AUDIO_SERVICE) as AudioManager
    }
    return this
        .onFocusChanged {
            if (it.isFocused) {
                audioManager.playSoundEffect(effectType)
            }
        }
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以将其添加到任何可聚焦的项目中。

Jetpack Compose TV Material 3 Clickable Surface的使用示例:

Surface(
  onClick = { },
  modifier = Modifier.playSoundEffectOnFocus(),
) {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

您可能还想在单击该项目时播放声音效果。为此,您可以创建一个可组合函数来按需播放音频并在onClick方法中使用它。

@Composable
fun getPlaySoundEffect(
  effectType: Int = AudioManager.FX_FOCUS_NAVIGATION_UP
): () -> Unit {
    val context = LocalContext.current
    val audioManager = remember {
        context.getSystemService(Context.AUDIO_SERVICE) as AudioManager
    }
    
    return { audioManager.playSoundEffect(effectType) }
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以按如下方式使用它:

val playSoundEffect = getPlaySoundEffect()

Surface(
  onClick = { playSoundEffect() },
  modifier = Modifier.playSoundEffectOnFocus(),
) {
  // ...
}
Run Code Online (Sandbox Code Playgroud)