setStreamMute никогда не включает звук

В документации сказано:

Команда отключения звука защищена от смерти клиентского процесса: если процесс с активным запросом отключения звука в потоке умирает, этот поток будет автоматически включен.

Запросы на отключение звука для данного потока являются кумулятивными: AudioManager может получить несколько запросов на отключение звука от одного или нескольких клиентов, и поток будет включен только тогда, когда будет получено такое же количество запросов на включение звука.

Что ж, первый абзац верен; Всякий раз, когда мой процесс умирает, все потоки, которые я заглушил, автоматически включаются. Однако, сколько бы раз я ни звонил setStreamMute(someStream, false), звук НИКОГДА не включается. В прошлый раз я пытался вызвать его более 1 миллиона раз после отключения звука только ОДИН РАЗ и НИЧЕГО не происходит!

Просто отметим: если я включу его тем же методом, что и звук, он останется без звука. Но при следующих вызовах того же метода он никогда не отключается.

Я отключаю звук в методе широковещательного приемника onReceive, который я запускаю с помощью диспетчера тревог. Так может быть, это потому, что мое приложение было убито во время между вызовом отключения звука и вызовом включения? (Но мое приложение все еще остается в оперативной памяти)

Может ли эта проблема быть из-за того, что я не сохраняю ссылку на AlarmManager (каждый раз получаю разные экземпляры?)

Кто-нибудь сталкивался с этой проблемой?


person Jong    schedule 26.10.2011    source источник


Ответы (4)


По-видимому, в этих версиях Android есть ошибка; Проверено на версиях 2.2 и 2.3.3, ошибка существует. Похоже, если вы вызовете setStreamMute для объекта AudioManager:

AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
am.setStreamMute(...., true);

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

am = null;
am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);

Неважно, сколько раз вы сейчас вызовете am.setStreamMute(..., false), он никогда не включится.

Я думаю, что плохо сообщить об этой ошибке сейчас ..

Урок: сохраняйте статическую ссылку на свой AudioManager.

@Michell Bak, спасибо, что подали мне идею проверить, не является ли это ошибкой программного обеспечения Android :) Я застрял на этом слишком много времени, и мне никогда не приходило в голову проверить, не моя ли это вина.

person Jong    schedule 28.10.2011
comment
Я использую версию Android 4.0 и ту же проблему здесь, посмотрите stackoverflow.com/questions/14899395/ - person Guilherme Gregores; 15.02.2013
comment
Сохраните ссылку на тот же экземпляр AudioManager (желательно как член вашего класса активности) - person Jong; 15.02.2013

Я никогда раньше не использовал этот API, но быстрый поиск в Google дал несколько результатов, но он не работал. Кажется, это ошибка, которая все еще присутствует в Android 2.3:

http://code.google.com/p/android/issues/detail?id=4235

person Michell Bak    schedule 26.10.2011
comment
Но эта проблема заключалась в том, что он не смог отключить звук, а не не смог включить звук. Вы видели другие результаты? Я не - person Jong; 27.10.2011

Я решаю проблему, помещая переменную аудио-менеджера в приложение

   public class myApplication extends Application {


  static AudioManager am;
      public void onCreate() {
    super.onCreate();
    am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    this.setMute(false);
      }
    }

Затем в моем классе активности добавьте эту функцию:

private AudioManager getAM() {
return ((elpApplication)getApplication()).am;

}

и вот как я использую getAM();

private void toogleMediaPlayerMute() {

    //defaultVolumn = am.getStreamVolume(AudioManager.STREAM_MUSIC);
    elpApplication app = getElpApp();
    Log.d("appmute", String.valueOf(app.isMute()));
    if (!app.isMute()) {
        getAM().setStreamVolume(AudioManager.STREAM_MUSIC, 0,
                AudioManager.FLAG_PLAY_SOUND);
        getAM().setStreamMute(AudioManager.STREAM_MUSIC, true);
        ismute = true;

    } else {
        int maxVolume = getAM().getStreamMaxVolume(AudioManager.STREAM_MUSIC);
        Log.d("maxvol", String.valueOf(maxVolume));
        getAM().setStreamMute(AudioManager.STREAM_MUSIC, false);
        getAM().setStreamVolume(AudioManager.STREAM_MUSIC, maxVolume,
                AudioManager.FLAG_SHOW_UI);

        ismute = false;
        // app.setMute(ismute);
    }
    app.setMute(ismute);
}
person RAY    schedule 31.12.2012

У меня была такая же проблема с более новыми версиями API. Итак, чтобы обойти эту проблему, я применил немного «старомодного» решения. Если ваш дизайн таков, что вы обрабатываете получение потока байтов / отправку потока байтов напрямую - отправьте массив байтов, заполненный нулями, если выбрано отключение звука: *

...
byte[] whatToSend = realByteData;
byte [] mutedOutput = new byte[recBuffSize];
Array.setByte( mutedOutput, 0, (byte) 0);
...
if ( muteSet )
  whatToSend = mutedOutput;

amountWritten = audioTrack.write(whatToSend, 0, amountRead);

*

person Magic Hands Pellegrin    schedule 13.02.2015