Как запретить "Громкую музыку может нанести вред вашему слуху..." предупреждение в Android

У меня есть приложение Android для планшета Samsung, в котором используется внешнее устройство, которое потребляет питание от разъема для наушников планшета. Когда внешнее устройство включено (программно максимизируя громкость), в Android на короткое время появляется всплывающее окно с предупреждением: "Громкая музыка может нанести вред вашему слуху, если вы слушаете его слишком долго..." Я бы хотел, чтобы это сообщение не было будет отображаться.

Здесь оскорбительная строка кода:

mAudioMgr.setStreamVolume(AudioManager.STREAM_MUSIC, mAudioMgr.getStreamMaxVolume(AudioManager.STREAM_MUSIC), 0);

Это не возможность только поворачивать его на полпути. Фактически, я видел, что на планшете отображается предупреждение (при изменении громкости вручную) даже при настройках громкости ниже, чем максимальная настройка.

И да, я записываю исходный том и восстанавливаю его, когда мы закончили с внешним устройством.

Спасибо за любые предложения.

Ответ 1

Так как вы не можете отключить системное сообщение, и у вас также будет проблема, когда пользователь вручную уменьшит громкость, я предлагаю вам сделать ряд элементов управления, которые помогут с этим. Максимальный объем:

public void maxVolume() {
    AudioManager audioManager = (AudioManager)context.getSystemService(this.AUDIO_SERVICE);
    while ( audioManager.getStreamVolume(AudioManager.STREAM_MUSIC) < audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC)) {
        audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, 0);
    }
}

Чтобы пользователи не могли вручную изменять громкость:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if ((keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) 
         || (keyCode == KeyEvent.KEYCODE_VOLUME_UP) 
         || (keyCode == KeyEvent.KEYCODE_VOLUME_MUTE)) {
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

Вы можете вызвать maxVolume() в методе onCreate, а затем вызвать его непосредственно перед тем, как вы начнете использовать процедуру вывода вывода, чтобы убедиться, что система не изменила ваш том. Кроме того, вы можете зарегистрировать прослушиватель для прослушивания изменений громкости, сделать maxVolume() static и вызвать его из прослушивателя. Надеюсь, вам это поможет!

Ответ 2

Я знаю, что этот вопрос довольно старый, но я сам столкнулся с этим вопросом. Я решил, что добавлю к ответам, приведенным с тем, что я нашел, в случае, если это поможет кому-то еще, что происходит на этом.

В одном из сообщений здесь упоминается, что предупреждение отсутствует в AOSP, но это неверно. Обратитесь к классу VolumePanel:: SafteyWarning: VolumePanel:: SafetyWarning

Как только вы просматриваете класс SafetyWarning, вы заметите, что внутри класса AudioManager есть скрытый метод disableSafeMediaVolume. Вы можете посредством рефлексии вызвать этот скрытый метод достаточно легко, но если вы это сделаете, вы получите исключение безопасности, так как оно требует системного разрешения "android.permission.STATUS_BAR_SERVICE".

Итак... с учетом сказанного, диалог, насколько я могу судить, не может быть программно подавлен, если у вас нет этого системного разрешения.

Что мы в итоге сделали с благом управления продуктом, мы кэшем настройку тома в SharedPreferences, а затем reset из кэша при запуске нашего приложения. Если это окажется выше порога для диалогового окна предупреждения, появится предупреждение, и пользователю просто нужно нажать OK, чтобы получить желаемый уровень громкости, но по крайней мере им не придется вручную reset самим объемом.

Несколько других заметок о том, почему некоторые не видят этого диалога. Вы увидите это только в том случае, если к устройству подключены наушники (или наушники или проводная гарнитура), и вы пытаетесь установить поток громкости мультимедиа на определенный порог (на вкладке Samsung Galaxy Tab этот порог составляет 60%). Если вы нажмете OK в диалоговом окне, он не будет отображаться повторно, если вы не перезапустите устройство или не отсоедините наушники и не включите их обратно (с томом, установленным на уровне или выше порога).

Надеюсь, это поможет кому-то.

Ответ 3

Я не знаю, можете ли вы рассмотреть эту большую часть ответа, но я уверен, что вы не сможете удалить это сообщение, поскольку оно отображается системой автоматически, а не тем, к чему вы можете получить доступ. Мой Samsung Galaxy S3 делает то же самое.

Кроме того, из того, что я могу прочитать в сети, некоторые устройства Android также уменьшают громкость, когда вы кладете гнездо для гнезда так, чтобы "вы не наносили вреда вашему слуху".

Можете ли вы переопределить уведомление, показывая свое собственное уведомление как можно раньше или позже? Уведомление является стандартным Toast.