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

Android AudioTrack播放采样数据无声音且流类型已弃用问题求助

问题原因

这个报错是因为你使用了已弃用的AudioTrack旧构造方法——错误提示针对的是AudioManager.STREAM_MUSIC这个流类型参数。从Android 8.0(API 26)开始,Google要求用AudioAttributes描述播放场景,而非直接传流类型;AudioTrack.MODE_STREAM是合法的,不需要修改。

具体修改方案

需要调整三个核心点:用AudioAttributes替代流类型、改用新构造方法、替换弃用的音量设置API。修改后的完整代码如下:

protected void playSound(int sampleRate, byte[] soundData) {
    try {
        int bufferSize = AudioTrack.getMinBufferSize(sampleRate, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);

        // 缓冲区变化或未初始化时,重新创建AudioTrack
        if (bufferSize != audTrackBufferSize || audioTrack == null) {
            if (audioTrack != null) {
                audioTrack.pause();
                audioTrack.flush();
                audioTrack.release();
            }

            // 1. 构造AudioAttributes,明确播放场景为媒体音乐
            AudioAttributes audioAttributes = new AudioAttributes.Builder()
                    .setUsage(AudioAttributes.USAGE_MEDIA)
                    .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                    .build();

            // 2. 封装音频格式参数(采样率、声道、编码)
            AudioFormat audioFormat = new AudioFormat.Builder()
                    .setSampleRate(sampleRate)
                    .setChannelMask(AudioFormat.CHANNEL_OUT_MONO)
                    .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
                    .build();

            // 3. 使用新的AudioTrack构造方法
            audioTrack = new AudioTrack(audioAttributes,
                    audioFormat,
                    bufferSize,
                    AudioTrack.MODE_STREAM,
                    AudioManager.AUDIO_SESSION_ID_GENERATE);
            audTrackBufferSize = bufferSize;
        }

        float gain = (float) (volume / 100.0);
        // 替换弃用的setStereoVolume,单声道场景用setVolume即可
        audioTrack.setVolume(gain);

        audioTrack.play();
        audioTrack.write(soundData, 0, soundData.length);
    } catch (Exception e) {
        Log.e("tone player", e.toString(), e);
    }
}

关键修改说明

  1. AudioAttributes的作用:USAGE_MEDIA + CONTENT_TYPE_MUSIC 完全等价于旧的STREAM_MUSIC,告诉系统这是媒体音乐播放场景,系统会据此分配音频资源、适配音量规则。
  2. 新构造方法:必须传入AudioAttributes和AudioFormat对象,把原来分散的参数统一封装,符合新API的设计规范。
  3. 音量设置:setVolume(float)替代弃用的setStereoVolume,单声道场景下只需传入一个音量比例值。

额外排查点

如果修改后仍无声音,可以检查:

  • 采样数据的格式是否和AudioFormat配置完全匹配(采样率、编码、声道数)
  • 设备媒体音量是否开启
  • 是否有其他应用抢占了音频焦点

内容的提问来源于stack exchange,提问作者SparkyNZ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 16:20:31