Звук Android с STREAM_ALARM - как отключить динамик при подключении наушников

Я разрабатываю приложение будильника для Android и использую STREAM_ALARM для воспроизведения звука будильника. Когда я подключаю наушники во время воспроизведения звука будильника, звук начинает воспроизводиться в наушниках, но также продолжает воспроизводиться в динамике. Но я хочу отключить динамик, чтобы пользователь мог подключить наушники и продолжать слушать звук, не мешая окружающим. Это может быть необычным поведением, но это очень важно для этого конкретного приложения будильника.

Возможно, я мог бы использовать STREAM_MUSIC, но:

  • Документы говорят, что Unless your app is an alarm clock, you should play audio using the STREAM_MUSIC stream.
  • Если будильник начинает звонить, а наушники уже подключены, мне нужно, чтобы звук звучал через динамик. STREAM_MUSIC этого не делает. Могут быть обходные пути, но мне нужен этот 100% надежный, поэтому было бы лучше сделать обходной путь для отключения звука динамик, когда это необходимо, чем обходной путь для того, чтобы сделать его громким, когда это необходимо.
  • Я не уверен, какие другие последствия это может иметь, это не кажется безопасным.

Итак, есть ли возможность заставить говорящего замолчать? Может быть, с помощью отражения?

Я также рассматривал возможность изменения типа потока на ActionHeadsetPlug на STREAM_MUSIC, но это требует остановки звука, воссоздания экземпляра MediaPlayer, поиска предыдущей позиции, повторной привязки любых событий, другой логики и т. д. Много работы для моего варианта использования. Заглушить динамик определенно было бы лучше, если бы это было возможно.


person David Riha    schedule 08.03.2019    source источник
comment
Воспроизведение звука как в динамике, так и в наушниках — это предполагаемое поведение для STREAM_ALARM (по крайней мере, так было раньше, когда я работал с этим материалом в Sony). Причина в том, что вы должны услышать будильник, даже если у вас нет наушников в ушах, но вы оставили их подключенными к телефону. Если вы не хотите такого поведения, используйте другой тип потока (например, STREAM_MUSIC).   -  person Michael    schedule 08.03.2019
comment
@Майкл Да, я знаю, что это предназначено, и я понимаю причину, я ищу способ переопределить его при подключении наушников, но сохранить его через динамик, если наушники уже были подключены, когда начал звонить будильник. Я обновил вопрос, пожалуйста, проверьте его сейчас :)   -  person David Riha    schedule 08.03.2019
comment
Что ж, поведение STREAM_ALARM такое, какое оно есть. Если вы не хотите такого поведения, вам следует использовать другой, более подходящий тип потока. Например, при запуске воспроизведения проверьте, подключены ли наушники, и в зависимости от этого выберите либо STREAM_ALARM, либо STREAM_MUSIC.   -  person Michael    schedule 08.03.2019