AudioManger.setStreamMute在api 23中已被弃用,推荐使用AudioManager.adjustStreamVolume
与AudioManager.ADJUST_MUTE
。
问题是这种标志仅支持api 23,而我应用程序的最小api为16。
是否有其他静音整个系统的方法?
如果没有,Google为什么会弃用此方法?
AudioManger.setStreamMute在api 23中已被弃用,推荐使用AudioManager.adjustStreamVolume
与AudioManager.ADJUST_MUTE
。
问题是这种标志仅支持api 23,而我应用程序的最小api为16。
是否有其他静音整个系统的方法?
如果没有,Google为什么会弃用此方法?
我会使用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)
将使其保持静音状态,而使用AudioManager.ADJUST_UNMUTE
的adjustStreamVolume
可能会取消静音。
根据用例,为了模拟旧语义,一种方法是在静音之前检查静音状态,类似以下内容:
静音:
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
// https://dev59.com/VFzUa4cB1Zd3GeqP45-L
audioManager.setStreamMute(stream, false);
}
if Build.version >= Build.Android.X
。 - Someone SomewheresetStreamVolume
没有被弃用,那么相对于set
来说调整有什么优势呢?两者都支持相同的语法。 - Abandoned Cart