废弃的AudioManger.setStreamMute的替代方法是什么?

12

AudioManger.setStreamMute在api 23中已被弃用,推荐使用AudioManager.adjustStreamVolumeAudioManager.ADJUST_MUTE

问题是这种标志仅支持api 23,而我应用程序的最小api为16。

是否有其他静音整个系统的方法?

如果没有,Google为什么会弃用此方法?

2个回答

28

我会使用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);
}

但是对于 API 小于 23 的情况,难道没有更好的解决方案吗? - dor00012
那就是解决方案。如果API小于23,则执行else语句。让它变得更好的唯一方法就是将其包装在一个方法中。 - phxhawke
我所说的比API 23更好的解决方案是指一种未被弃用的方法,即“setStreamMute”的替代方法。我明白可能并没有更好的解决方案,谢谢。 - dor00012
2
setStreamMute在之前的版本中并未被弃用,只有在API 23上才被弃用。如果应用程序在使用低于23的API的手机上运行,则它将按预期工作。 - phxhawke
我知道你的意思,phxhawke。很快代码将充满这些 if Build.version >= Build.Android.X - Someone Somewhere
1
setStreamVolume没有被弃用,那么相对于set来说调整有什么优势呢?两者都支持相同的语法。 - Abandoned Cart

9

已接受的答案可以很好地静音系统,但如果您需要恢复状态(例如,当用户暂停/退出您的应用程序时),请注意adjustStreamVolumesetStreamMute方法的语义不同:

根据文档,对于setStreamMute

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

这似乎不适用于使用AudioManager.ADJUST_MUTEadjustStreamVolume。换句话说,如果在您使用setStreamMute (stream, true)将其静音之前,该流的状态已经被静音,那么立即使用setStreamMute (stream, false)将使其保持静音状态,而使用AudioManager.ADJUST_UNMUTEadjustStreamVolume可能会取消静音。

根据用例,为了模拟旧语义,一种方法是在静音之前检查静音状态,类似以下内容:

静音:

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

这假设用户不太可能在你的应用程序解除静音后调用另一个应用程序来静音该流,并期望该流保持静音状态(无论如何,似乎没有办法检查这一点)。
顺便说一句,“isStreamMute”方法以前是隐藏的,只有在API 23中才被取消隐藏,从而使其可以用于此目的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接