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

Android Studio中MediaPlayer调用无声音问题求助

音乐播放器无声音问题排查

先看你的代码:

MusicPlayer类:

class MusicPlayer(c: Context){
    var context: Context = c
    private var player: MediaPlayer = MediaPlayer.create(context,R.raw.sth)

    fun start() {
        Log.d("Music", context.toString())
        player.setOnPreparedListener(OnPreparedListener {
            Log.i(
                "Music",
                "player: $player"
            )
        })
        player.isLooping = false
        player.setVolume(1F, 1F)
        Log.d("Music", "START")
        player.start()
        Log.d("Music", "AFTER START")
    }
}

MainActivity调用代码:

class MainActivity : AppCompatActivity(){

    private lateinit var player: MusicPlayer
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        player = MusicPlayer(this)

        player.start()
    }
}

针对无声音的问题,可以从以下几个方向排查:

  • 配置正确的音频属性
    API 26及以上版本,setAudioStreamType已被弃用,若未指定正确的AudioAttributes,系统可能无法正确路由音频输出。修改MusicPlayer的初始化逻辑:

    private var player: MediaPlayer = MediaPlayer.create(context,R.raw.sth).apply {
        val audioAttributes = AudioAttributes.Builder()
            .setUsage(AudioAttributes.USAGE_MEDIA)
            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
            .build()
        setAudioAttributes(audioAttributes)
    }
    
  • 验证音频文件有效性
    确认sth.mp3文件未损坏,且编码符合Android支持的MP3标准(如MPEG-1 Layer 3,比特率8-320kbps)。可以替换为一个已知能正常播放的MP3文件测试,排除文件本身的问题。

  • 检查设备/模拟器音频设置

    1. 确保运行模拟器的电脑音量未静音且处于合适大小,部分模拟器的音频输出依赖宿主机设置;
    2. 切换到真机测试,排除模拟器音频驱动bug;
    3. 在系统设置中确认媒体音量未被静音(部分设备会区分通话、媒体等不同音量通道)。
  • 确认MediaPlayer状态
    在start()方法中增加状态检查日志,确认播放器是否真的进入播放状态:

    fun start() {
        Log.d("Music", "Player prepared: ${player.isPrepared}")
        Log.d("Music", "Player playing before start: ${player.isPlaying}")
        // 原有代码...
        player.start()
        Log.d("Music", "Player playing after start: ${player.isPlaying}")
    }
    

    如果日志显示isPlaying始终为false,说明播放器未成功初始化,可以增加空值判断:

    private var player: MediaPlayer? = MediaPlayer.create(context,R.raw.sth)
    
    fun start() {
        player ?: run {
            Log.e("Music", "MediaPlayer create failed")
            return
        }
        // 后续操作使用player!!
    }
    
  • 修正监听器设置时机
    MediaPlayer.create()会直接完成prepare操作,之后设置OnPreparedListener不会触发回调。如果需要监听准备完成,应在创建播放器实例前设置,但更合理的方式是直接使用create返回的已准备好的实例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 05:33:26