你好,堆栈溢出社区,

我目前正在开发一款使用Jetpack Compose的Android电视应用程序,我面临着一个似乎找不到解决方案的问题.

在传统的Android开发中,我可以很容易地使用AudioManager类来处理系统声音.然而,随着向Jetpack Compose的过渡,我不确定如何做同样的事情.

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

AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
audioManager.playSoundEffect(Sounds.DISMISS);

我如何才能在Jetpack Compose中达到同等的水平?任何帮助都将不胜感激.如果需要任何额外的信息,我非常乐意提供.

提前谢谢您.

(它没有起作用:)

<resources>
    <style name="Theme.xxx" parent="android:Theme.Material.Light.NoActionBar">
        <item name="android:soundEffectsEnabled">true</item>
    </style>
</resources>

推荐答案

当一件物品获得焦点时,你最需要的是音效.因此,您可以创建如下所示的自定义修改器来执行此操作.

@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)
            }
        }
}

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

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

Surface(
  onClick = { },
  modifier = Modifier.playSoundEffectOnFocus(),
) {
  // ...
}

您可能还希望在单击该项目时播放声音效果.为此,您可以创建一个可组合的函数来按需播放音频,并在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) }
}

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

val playSoundEffect = getPlaySoundEffect()

Surface(
  onClick = { playSoundEffect() },
  modifier = Modifier.playSoundEffectOnFocus(),
) {
  // ...
}

Android相关问答推荐

RippleTheme在作曲material 1.7.0中被废弃

未解析的引用:背景 colored颜色

带有kSP而不是kapt的Hilt

Android事件:APP_SCOUT_HANG警告SQLite

在Jetpack Compose中,如何判断屏幕是否已重新组合?

如果我的圆形图像的顶部居中于卡片内部,我如何在其下方画一条弧线?

当按下通知时,将Android应用程序置于前台

如何制作安卓';s FileProvider在Android 11上使用外部存储+

在模块 jetified-kotlin-stdlib-1.8.10 中发现重复的类 kotlin.random.jdk8,带有启动基准

安卓模拟器打不开

自定义 Compose Arrangement 以在 LazyRow/LazyColumn 的开头和结尾添加额外的间距

如何在 Android Jetpack compose 中为列表初始填充设置动画

如何将设备屏幕位置转换为发送事件位置?

运行一次 kotlin 流,但在下游收到两次

我应该使用 Bluetooth Classic 还是 Bluetooth LE 与我的移动应用程序通信?

在 Android Studio 中替换字符串中的 "

单击登录按钮后从应用程序中退出

MVVM - 这个逻辑的最佳层是什么?

Android Studio,Db 连接错误:发生异常情况导致驱动程序失败.请报告此异常

Jetpack Compose Tapjacking:过滤对模糊 UI 的touch