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); } }
关键修改说明
- AudioAttributes的作用:
USAGE_MEDIA+CONTENT_TYPE_MUSIC完全等价于旧的STREAM_MUSIC,告诉系统这是媒体音乐播放场景,系统会据此分配音频资源、适配音量规则。 - 新构造方法:必须传入
AudioAttributes和AudioFormat对象,把原来分散的参数统一封装,符合新API的设计规范。 - 音量设置:
setVolume(float)替代弃用的setStereoVolume,单声道场景下只需传入一个音量比例值。
额外排查点
如果修改后仍无声音,可以检查:
- 采样数据的格式是否和
AudioFormat配置完全匹配(采样率、编码、声道数) - 设备媒体音量是否开启
- 是否有其他应用抢占了音频焦点
内容的提问来源于stack exchange,提问作者SparkyNZ
相关产品推荐
相关产品推荐

