setStreamMute никогда не включает звук - PullRequest
5 голосов
/ 27 октября 2011

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

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

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

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

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

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

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

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

Ответы [ 4 ]

21 голосов
/ 28 октября 2011

Соответственно, - это ошибка в этих версиях 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 :) I 'Я слишком долго застрял на этой штуке, и у меня никогда не было мысли узнать, не моя ли это вина.

1 голос
/ 31 декабря 2012

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

   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);
}
1 голос
/ 27 октября 2011

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

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

0 голосов
/ 13 февраля 2015

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

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

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

*

...