Java Can';t从前到后扬声器的开关

Java Can';t从前到后扬声器的开关,java,android,audio,speaker,Java,Android,Audio,Speaker,我正在开发我的应用程序,它可以通过前扬声器或后扬声器播放声音文件,并且可以“即时”更改。代码如下: // mediaPlayer was created previously and then started to play ok private void switchTarget() { int pos = 0; try { if (mediaPlayer.isPlaying()) { p

我正在开发我的应用程序,它可以通过前扬声器或后扬声器播放声音文件,并且可以“即时”更改。代码如下:

    // mediaPlayer was created previously and then started to play ok

    private void switchTarget() {
        int pos = 0;
        try {
            if (mediaPlayer.isPlaying()) {
                pos = mediaPlayer.getCurrentPosition();
                mediaPlayer.stop();
            }
            mediaPlayer.reset();
            FRONT = !FRONT;
            mediaPlayer.setAudioStreamType(FRONT ? AudioManager.STREAM_VOICE_CALL : AudioManager.STREAM_RING);
            mediaPlayer.setDataSource(WakeUp.this, mediaPath);
            mediaPlayer.prepare();
            mediaPlayer.seekTo(pos);
            mediaPlayer.start();
        } catch (Exception e) {Toast.makeText(context, e.toString(),Toast.LENGTH_LONG).show();}
    }
关键是:

-如果我用FRONT=false开始播放,也就是说,声音开始通过后扬声器播放,我可以切换,并且声音继续通过前扬声器播放,正如预期的那样。
-当FRONT最初为true时,切换到后扬声器将导致完全没有声音,但再次切换将通过前扬声器恢复声音。

总之,在前扬声器中播放音频文件后,切换到后扬声器没有效果。此外,由于音频文件中的时间位置是通过开关保持的,因此在后扬声器工作时似乎已经过了一段时间,尽管听不到声音。

例如,我启动前扬声器10秒(声音正常),切换到后扬声器5秒(无声音),切换回前扬声器(正常,文件在第15秒恢复)。我更改FRONT变量并再次运行应用程序,后扬声器(工作)10秒,切换到前扬声器(也工作),然后返回到后扬声器(无声音)。

也许,不知何故,当前扬声器工作并停止时,会阻塞后扬声器。

我甚至尝试保留两个mediaPlayer变量,每个扬声器一个,交替播放和停止,结果都是一样的


提前谢谢

请改用audioManager.setspeakerphone(true)。
这是用于在扬声器和耳机之间切换的预期API

请改用audioManager.setspeakerphone(true)。
这是用于在扬声器和耳机之间切换的预期API

我说话太早了,没有工作。

新代码:

// onCreate
FRONT = true;
mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource(WakeUp.this, mediaPath);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);
try {
    mediaPlayer.prepare();
} catch (Exception e) {}
mediaPlayer.start();
...
...

private void switchTarget() {
    FRONT = !FRONT;
    AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    audioManager.setSpeakerphoneOn(!FRONT);
}
如果扬声器最初处于打开状态,onCreate将通过后扬声器播放声音,切换后,通过前扬声器播放声音,一切正常,但再次切换时,后扬声器不起作用

而且,如果扬声器最初关闭,onCreate使用前扬声器,声音正常,但我切换到后扬声器,什么也听不到。然后我切换回前扬声器,声音正常


我迷路了…

我说话太早了,没有工作。

新代码:

// onCreate
FRONT = true;
mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource(WakeUp.this, mediaPath);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);
try {
    mediaPlayer.prepare();
} catch (Exception e) {}
mediaPlayer.start();
...
...

private void switchTarget() {
    FRONT = !FRONT;
    AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    audioManager.setSpeakerphoneOn(!FRONT);
}
如果扬声器最初处于打开状态,onCreate将通过后扬声器播放声音,切换后,通过前扬声器播放声音,一切正常,但再次切换时,后扬声器不起作用

而且,如果扬声器最初关闭,onCreate使用前扬声器,声音正常,但我切换到后扬声器,什么也听不到。然后我切换回前扬声器,声音正常


我迷路了…

使用audioManager.Setspeakerphone(true)而不是Aweasome。我想我应该写这篇文章作为答案,而不是使用audioManager.SetSpeakerPhone(真)而不是Aweasome。我想我应该把这个写下来作为答案