setStreamMute永远不会取消静音

时间:2011-10-26 21:10:12

标签: android android-audiomanager

在文档中,有人说:

  

保护静音命令免受客户端进程死亡的影响:如果流上有活动静音请求的进程终止,则此流将自动取消静音。

     

对给定流的静音请求是累积的:AudioManager可以从一个或多个客户端接收几个静音请求,只有在收到相同数量的取消静音请求时才会取消静音。

嗯,第一段是真的;每当我的进程终止时,我静音的所有流都会自动取消静音。 但是,无论我拨打setStreamMute(someStream, false)多少次,它都永远无法取消静音。 上次我在静音后尝试调用它超过100万次而且没有发生!

提一下 - 如果我用相同的方法取消静音,我将其静音 - 它保持不变。但是在下一次调用相同的方法时 - 它永远不会取消静音。

我在广播接收器onReceive方法中静音,我开始使用警报管理器。也许是因为我的应用程序在静音呼叫和取消静音呼叫之间被杀死了? (但我的应用程序仍然留在RAM中)

这个问题可能是因为我没有保留对AlarmManager的引用(每次都有不同的实例吗?)

有没有人遇到过这个问题?

4 个答案:

答案 0 :(得分:21)

显然,这些Android版本中的错误;测试版本2.2和2.3.3并且存在错误。 看起来,如果你在AudioManager对象上调用setStreamMute

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

丢失您的参考,然后获得参考:

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

无论 ,现在多次拨打am.setStreamMute(..., false)永远不会取消静音。

我认为现在报告这个错误...

课程:保留对音频管理器的静态引用。

@Michell Bak,谢谢你给我一个检查它是否是Android软件bug的想法:)我已经被困在这个东西太多时间了,我从来没有想过看看它不是我的错

答案 1 :(得分:1)

我之前从未使用过该API,但是快速的Google搜索,返回了一些不起作用的结果。它似乎是一个仍然存在于Android 2.3中的错误:

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

答案 2 :(得分:1)

我通过将音频管理器变量放在应用程序中来解决问题

   public class myApplication extends Application {


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

然后在我的activity类中添加这个函数:

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);
}

答案 3 :(得分:0)

我遇到了与新版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);

*