Не могу переключиться с переднего на задний динамик

Я работаю над своим приложением, которое воспроизводит звуковой файл через передний или задний динамик, и это можно изменить «на лету». Вот код:

    // 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, по одной для каждого динамика, и попеременно воспроизводить и останавливать, с теми же плохими результатами.

Заранее спасибо!


person dondindon    schedule 31.12.2019    source источник
comment
Вместо этого используйте audioManager.setSpeakerPhoneOn(true)   -  person Rick Sanchez    schedule 31.12.2019
comment
Потрясающий. Я думаю, я должен написать это как ответ вместо этого   -  person Rick Sanchez    schedule 31.12.2019


Ответы (2)


Вместо этого используйте audioManager.setSpeakerPhoneOn(true). Это предполагаемый API для переключения между громкой связью и наушниками.

person Rick Sanchez    schedule 31.12.2019

Я говорил слишком рано, не работает.

Новый код:

// 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 использует передний динамик, звук работает, но потом я переключаюсь на задний динамик и ничего не слышу. Затем я переключаюсь обратно на передний динамик, и звук в порядке.

Я потерялся...

person dondindon    schedule 31.12.2019