即使插入耳机,如何通过扬声器播放音频?

How to Play audio through speaker even when headset is plugged in?

问题的标题可能看起来重复,但我的问题是有时会出现问题并导致故障。我使用下面的代码在插入耳机时通过扬声器播放。

AudioManager audioManager = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE);

        audioManager.setMode(AudioManager.STREAM_MUSIC);
        audioManager.setSpeakerphoneOn(true);

        if(! Globals.mediaPlayer.isPlaying()){
            Globals.mediaPlayer.start();
        }

以上代码通过以下方式播放音频: 1. 很少几次,完美播放。 2. 大多数时候,它会在背景中播放循环播放的声音。 3. 几次都不播放

插入耳机时系统声音似乎没有错误。例如-设置铃声正确播放相应的铃声没有任何故障。请帮助我了解如何在插入耳机的情况下通过扬声器正确播放声音。

我遇到了一个我解决的类似问题,创建一个新的媒体播放器(如果它没有播放)并将媒体播放器流类型设置为与音频管理器相同的模式,尝试这样的事情:

AudioManager audioManager = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE);
audioManager.setMode(AudioManager.STREAM_MUSIC);
audioManager.setSpeakerphoneOn(true);

if(! Globals.mediaPlayer.isPlaying()){
    MediaPlayer mp = MediaPlayer.create(....);
    mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
    mp.start();
}

在我的例子中,我使用的是 AudioManager.MODE_IN_COMMUNICATION。 另外一定要设置权限

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

在AndroidManifest.xml

经过一些研究(可能不止于此),我找到了解决方案。

我们应该创建自己的 MediaPlayer 实例并为该实例设置音频流类型,而不是更改 AudioManager 的设置。我们可以将其设置为 STREAM_RING 以将音频路由到耳机和扬声器。

player.reset();
    player.setAudioStreamType(AudioManager.STREAM_RING);
    try {
        player.setDataSource(context, uri);
        player.prepareAsync();}

然后,您可以监听onPreparedListener来启动音频。请查看博客Route audio through speaker in Android以获得更好的图片。