Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android setStreamMute从不取消静音_Android_Android Audiomanager - Fatal编程技术网

Android setStreamMute从不取消静音

Android setStreamMute从不取消静音,android,android-audiomanager,Android,Android Audiomanager,文件中说: mute命令可防止客户端进程死亡:如果流上具有活动静音请求的进程死亡,则此流将自动取消静音 给定流的静音请求是累积的:AudioManager可以从一个或多个客户端接收多个静音请求,并且仅当接收到相同数量的取消静音请求时,才会取消静音流 那么第一段是对的,;每当我的进程终止时,我静音的所有流都会自动取消静音。 然而,无论我调用多少次setStreamMute(someStream,false)它都不会取消静音。 上次我试着在静音一次后呼叫它超过100万次,但什么也没发生 只是要提一下

文件中说:

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

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

那么第一段是对的,;每当我的进程终止时,我静音的所有流都会自动取消静音。 然而,无论我调用多少次
setStreamMute(someStream,false)
它都不会取消静音。 上次我试着在静音一次后呼叫它超过100万次,但什么也没发生

只是要提一下——如果我用同样的方法将其取消静音,它将保持取消静音状态。但是在对同一方法的下一次调用中,它从不取消静音

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

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


有人遇到过这个问题吗?

我以前从未使用过这个API,但在谷歌上快速搜索后,返回了一些不起作用的结果。这似乎是Android 2.3中仍然存在的一个bug:


显然,这些安卓版本中有一个bug;针对版本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的静态引用


@Michel Bak,谢谢你给我这个主意来检查是否是Android软件的错误:)我已经在这个问题上纠缠了太多时间,我从来没有想到这不是我的错。

我通过在应用程序中加入audio manager变量来解决这个问题

   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()


我在使用新版本的API时也遇到了同样的问题。所以,为了解决这个问题,我实施了一些“老派”的解决方案。如果您的设计能够处理获取字节流/直接发送字节流-如果选择了静音,则发送一个填充有零的字节数组: *


*

但问题是它无法静音,而不是取消静音。你看到其他结果了吗?我没有。我使用的是安卓4.0版本,这里也有同样的问题,请查看并保留对
AudioManager
的相同实例的引用(最好是作为活动类的成员)
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);
}
...
byte[] whatToSend = realByteData;
byte [] mutedOutput = new byte[recBuffSize];
Array.setByte( mutedOutput, 0, (byte) 0);
...
if ( muteSet )
  whatToSend = mutedOutput;

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