在Service启动的子线程中创建MediaPlayer出现create方法无法解析错误求助
问题解决
根因定位
你遇到的编译报错和Context参数完全无关,报错的核心原因是 MediaPlayer.create() 没有接收short[]类型作为第二个参数的重载,你传入的AudioData为短整型数组,IDE无法匹配到对应方法签名,才会误报第一个参数存在问题。
官方MediaPlayer.create()支持的参数类型
所有合法的重载第二个参数仅支持以下两类输入:
- 本地/网络音频资源的Uri:
create(Context context, Uri uri) - App内置raw资源的ID:
create(Context context, int resId)
其余带Surface、AudioAttributes的扩展重载,同样不支持short[]类型的输入。
解决方案:用AudioTrack播放PCM短整型数组
如果你的AudioData是裸PCM音频数据,直接用AudioTrack实现播放即可,参考代码如下:
// 替换为你实际音频对应的参数 int sampleRate = 44100; // 采样率 int channelConfig = AudioFormat.CHANNEL_OUT_MONO; // 单声道,立体声改为CHANNEL_OUT_STEREO int audioFormat = AudioFormat.ENCODING_PCM_16BIT; // 对应short类型的16位PCM int bufferSize = AudioTrack.getMinBufferSize(sampleRate, channelConfig, audioFormat); // 初始化AudioTrack AudioTrack audioTrack = new AudioTrack( AudioManager.STREAM_MUSIC, sampleRate, channelConfig, audioFormat, bufferSize, AudioTrack.MODE_STREAM ); // 播放逻辑 audioTrack.play(); audioTrack.write(AudioData, 0, AudioData.length); // 播放结束后释放资源 audioTrack.stop(); audioTrack.release();
额外注意事项
- 无需单独创建新的Service,当前架构只要替换正确的音频播放API即可正常运行
- 建议在Service的
onDestroy回调中主动终止工作线程、释放音频播放资源,避免出现内存泄漏、音频设备占用的问题
内容的提问来源于stack exchange,提问作者user12628549
相关产品推荐
相关产品推荐

