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