You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio播放音频报错:AUDIO_CONTENT_TYPE_UNKNOWN属性无效

解决方案

问题根源

  • Composable 会频繁触发重组,你直接在组件顶层创建 MediaPlayer,每次重组都会生成新实例,导致音频资源冲突、属性未正确初始化。
  • 未显式设置音频的内容类型和使用场景,系统无法正确识别音频流属性,触发「属性无效」错误。
  • 未管理 MediaPlayer 的生命周期,未在组件销毁时释放资源,引发资源泄漏问题。

修复后的代码

@Composable
fun BreathePage() {
    val currentContext = LocalContext.current
    // 使用 remember 缓存 MediaPlayer,避免重组重复创建
    val mediaPlayer = remember {
        MediaPlayer.create(currentContext, R.raw.watersound).apply {
            // 显式设置音频属性,解决类型未知问题
            setAudioAttributes(
                AudioAttributes.Builder()
                    .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                    .setUsage(AudioAttributes.USAGE_MEDIA)
                    .build()
            )
        }
    }

    // 使用 DisposableEffect 在组件销毁时释放 MediaPlayer 资源
    DisposableEffect(Unit) {
        onDispose {
            mediaPlayer.release()
        }
    }

    Box(modifier = Modifier.fillMaxSize()) {
        Image(
            painter = painterResource(id = R.drawable.waveywater),
            contentDescription = "背景水波",
            contentScale = ContentScale.FillBounds
        )
    }

    Column(
        modifier = Modifier.fillMaxSize(),
        verticalArrangement = Arrangement.Center,
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        Row(
            verticalAlignment = Alignment.CenterVertically,
            horizontalArrangement = Arrangement.Center
        ) {
            IconButton(onClick = {
                if (!mediaPlayer.isPlaying) {
                    mediaPlayer.start()
                }
            }) {
                Icon(painter = painterResource(id = R.drawable.playicon), contentDescription = "播放")
            }
            IconButton(onClick = {
                if (mediaPlayer.isPlaying) {
                    mediaPlayer.pause()
                }
            }) {
                Icon(painter = painterResource(id = R.drawable.pauseicon), contentDescription = "暂停")
            }
        }
    }
}

关键修改点

  • 用 remember 缓存 MediaPlayer:确保整个组件生命周期内只有一个实例,避免重复创建导致的资源冲突。
  • 添加音频属性配置:通过 AudioAttributes 指定内容类型为音乐、使用场景为媒体播放,让系统正确识别音频流。
  • 用 DisposableEffect 管理资源:在组件销毁时调用 release() 释放 MediaPlayer,防止资源泄漏。
  • 增加播放/暂停状态判断:避免重复调用 start() 或 pause() 引发异常。

额外排查点

  • 检查 R.raw.watersound 文件是否损坏,可重新替换MP3文件测试。
  • 确认项目的 res/raw 目录是否存在,且文件未被误删除或重命名。
  • 若仍报错,可尝试清理项目缓存(File > Invalidate Caches...)后重新构建。

内容的提问来源于stack exchange,提问作者Yunus Emrah Uluçay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 02:15:57