Что может быть причиной того, что setVolume работает на Google Pixel, но не на Galaxy S9?

#java #android

#java #Android

Вопрос:

В настоящее время я пытаюсь выводить аудио MediaPlayer по левому, правому или обоим каналам, используя функцию setVolume. Во время тестирования функция работает должным образом на Google Pixel 2 XL под управлением 9.0 Pie. При тестировании на моем втором устройстве Samsung Galaxy S9 под управлением 8.0 Oreo звук воспроизводится на обоих каналах и, похоже, не зависит от вызовов setVolume.

У меня нет никаких ошибок в консоли, поэтому я не совсем уверен, с чего начать устранение неполадок. Как указано выше, приложение протестировано и работает на Pixel 2 XL с 9.0 Pie, но не работает на Galaxy S9 с 8.0 Oreo.

 private void audioTestFunction() {
        if (audioSwitch.isChecked()) {
            coolChangeEffect("Stop Audio Test", audioSwitch);

            mp = MediaPlayer.create(getApplicationContext(), R.raw.audio_test);

            mp.setLooping(true);
            mp.start();

            switch (channels.getCheckedRadioButtonId()){
                case R.id.left_channel_button:
                    mp.setVolume(1.0f, 0.0f);
                    break;
                case R.id.both_channels_button:
                    mp.setVolume(1.0f, 1.0f);
                    break;
                case R.id.right_channel_button:
                    mp.setVolume(0.0f, 1.0f);
                    break;
                default:
                    mp.setVolume(1.0f, 1.0f);
                    break;
            }

        } else {
            coolChangeEffect("Audio Test", audioSwitch);
            mp.stop();
        }
    }
  

При выполнении на Pixel 2 XL приложение устанавливает громкость каждого канала в зависимости от того, какой переключатель выбран. При запуске на Galaxy S9 приложение продолжает воспроизводиться на обоих каналах без изменения громкости, независимо от того, какой переключатель был выбран.

Ответ №1:

Возможно, что ваш медиаплеер все еще находится в состоянии ожидания после вашего вызова mp.start() в течение нескольких миллисекунд. В документации Andoid говорится, что если setVolume вызывается из состояния ожидания, то никаких ошибок не будет выдано, однако никаких изменений в состоянии медиаплеера обнаружено не будет.

Если это проблема, потенциальным решением было бы подождать, пока mp.isPlaying() не вернет значение true, прежде чем вводить ваше заявление switch. Возможно, что звуковой драйвер Samsung имеет небольшую задержку, и это вызывает эту проблему.

Цитата из документации Android:

Существует тонкое, но важное различие между недавно созданным объектом MediaPlayer и объектом MediaPlayer после вызова reset(). Вызов таких методов, как setVolume (float, поплавок), является ошибкой программирования… в режиме ожидания для обоих случаев.

Если какой-либо из этих методов вызывается сразу после создания объекта MediaPlayer, предоставленный пользователем метод обратного вызова OnErrorListener.onError() не будет вызван внутренним движком проигрывателя, и состояние объекта останется неизменным; но если эти методы вызываются сразу после reset(), предоставленный пользователем метод обратного вызова OnErrorListener.onError() будет вызван внутренним движком проигрывателя, и объект будет переведен в состояние ошибки .

Комментарии:

1. как это пытается ответить на вопрос … или даже объяснить разницу?

2. @Dylan Я пытался внедрить решение, которое проверяет, когда mp.isPlaying() и решение, которое использует mp.setOnPreparedListener() , но ни то, ни другое, к сожалению, не решило проблему на Galaxy S9. Pixel 2 XL продолжает работать должным образом при обеих попытках решения.

3. Вау. это действительно интересно, мне интересно, может ли это быть ошибкой на стороне Samsung. Вы пробовали ответ Мартина? Кажется, это не связано, но возможно.. Кроме того, я бы попробовал изменить громкость и ввести одинаковое значение в оба параметра. Ответ Мартина заставил меня захотеть попробовать это, но я не с вами.

4. Я попытался снова попробовать предложение @MartinZeitler, но, похоже, я могу только протестировать динамики, но не изменять какие-либо настройки. Чтобы уточнить, я не пытаюсь протестировать динамики моего телефона, я пытаюсь выводить звук либо на левый, либо на правый, либо на оба канала.

5. @Dylan Я собираюсь попробовать отрегулировать громкость с помощью setVolume функции, как вы сказали (so setVolume(0.5f, 0.5f) ), и посмотреть, получу ли я какие-либо результаты.

Ответ №2:

Проблема решена!

Исходный код был правильным, Galaxy S9 необходимо было обновить до Android 9.0 Pie, чтобы setVolume() функции заработали.

Следуя совету @ Dylan, я считаю, что это просто ошибка Samsung, подкрепленная тем фактом, что решением было обновление системы.