Android 不推荐使用的AudioManger.setStreamMute的替代方案?
AudioManger.setStreamMute现在已被api 23弃用,最好使用Android 不推荐使用的AudioManger.setStreamMute的替代方案?,android,android-6.0-marshmallow,android-audiomanager,Android,Android 6.0 Marshmallow,Android Audiomanager,AudioManger.setStreamMute现在已被api 23弃用,最好使用AudioManager.adjustStreamVolume和AudioManager.Adjustmute. 我的问题是,这种标志只支持api 23,而我的应用程序最低支持api 16 有没有其他办法使整个系统静音 如果不是,谷歌为什么会反对这种方法呢?我的做法是使用If/else块根据应用程序当前运行的Android版本来使用正确的调用 // Change the stream to your stream
AudioManager.adjustStreamVolume
和AudioManager.Adjustmute.
我的问题是,这种标志只支持api 23,而我的应用程序最低支持api 16
有没有其他办法使整个系统静音
如果不是,谷歌为什么会反对这种方法呢?我的做法是使用If/else块根据应用程序当前运行的Android版本来使用正确的调用
// Change the stream to your stream of choice.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
am.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_MUTE, 0);
} else {
am.setStreamMute(AudioManager.STREAM_MUSIC, true);
}
接受的答案在静音系统时效果良好,但如果您需要恢复状态(例如,当用户暂停/退出应用程序时),请注意
adjustStreamVolume
和setStreamMute
方法的语义不同:
对于setStreamMute
,来自文档:
给定流的静音请求如下所示:
累积:AudioManager可以接收来自的多个静音请求
一个或多个客户端和流只有在相同的情况下才会取消静音
接收到的取消静音请求数
使用AudioManager.ADJUST_MUTE的adjustStreamVolume
似乎并非如此。换句话说,如果在您使用setStreamMute(stream,true)
将流静音之前,流的状态已经静音,则立即setStreamMute(stream,false)
将使流保持静音状态,而adjustStreamVolume
使用AudioManager。ADJUST\u UNMUTE
可能会将流取消静音
根据用例,要模拟旧语义,一种方法是在静音之前检查静音状态,如下所示-
要静音:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!audioManager.isStreamMute(stream)) {
savedStreamMuted = true;
audioManager.adjustStreamVolume(stream, AudioManager.ADJUST_MUTE, 0);
}
} else {
audioManager.setStreamMute(stream, true);
}
要取消静音:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (savedStreamMuted) {
audioManager.adjustStreamVolume(stream, AudioManager.ADJUST_UNMUTE, 0);
savedStreamMuted = false;
}
} else {
// Note that this must be the same instance of audioManager that mutes
// http://stackoverflow.com/questions/7908962/setstreammute-never-unmutes?rq=1
audioManager.setStreamMute(stream, false);
}
这假设用户不太可能调用另一个应用程序来静音中间的流,并期望流在应用程序取消静音后保持静音(无论如何,似乎没有办法检查这一点)
顺便说一句,
isStreamMute
方法以前是隐藏的,只是在API 23中没有隐藏,使其能够用于此目的。但是对于API小于23的情况,难道不应该有更好的解决方案吗?这就是解决方案。如果API小于23,则将执行else。我唯一能让它变得更好的方法是将它包装在一个方法中。我所说的api小于23的更好的解决方案是指一个没有被弃用的方法——“setStreamMute”的替代方法。我知道可能没有,谢谢。setStreamMute在以前的版本中没有被弃用。仅适用于API 23。如果应用程序在使用API小于23的手机上运行,它将按预期工作。setStreamVolume
未被弃用,那么相对于set进行调整是否有优势?两者都支持相同的语法。