【问题标题】:setStreamMute never unmutessetStreamMute 从不取消静音
【发布时间】:2011-10-26 21:10:11
【问题描述】:

在文档中是这样说的:

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

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

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

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

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

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

有人遇到过这个问题吗?

【问题讨论】:

    标签: android android-audiomanager


    【解决方案1】:

    显然,这些 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),它都永远不会取消静音。

    我想我现在应该报告这个错误..

    课程:保持对 AudioManager 的静态引用。

    @Michell Bak,感谢您给了我检查它是否是 Android 软件错误的想法 :) 我在这件事上停留了太多时间,我从来没有想过看看这是否不是我的错.

    【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 但是这个问题是静音失败,不是取消静音失败。你看到其他结果了吗?我没有
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      我在使用更新版本的 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);
      

      *

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多