5

在文档中,它说:

静音命令可防止客户端进程死亡:如果在流上具有活动静音请求的进程死亡,则该流将自动取消静音。

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

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

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

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

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

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

4

4 回答 4

21

显然,这些 Android 版本存在错误;测试版本 2.2 和 2.3.3 并且存在错误。看起来,如果您调用setStreamMuteAudioManager 对象:

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 软件错误的想法 :) 我已经被这件事困住了太多时间,而且我从来没有想过看看这是否不是我的错。

于 2011-10-28T12:19:06.903 回答
1

我以前从未使用过该 API,但是快速的 Google 搜索返回了一些结果,但它无法正常工作。这似乎是 Android 2.3 中仍然存在的错误:

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

于 2011-10-26T21:12:33.730 回答
1

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

   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);
}
于 2012-12-31T10:55:41.190 回答
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);

*

于 2015-02-13T03:28:08.853 回答