Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.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 不推荐使用的AudioManger.setStreamMute的替代方案?_Android_Android 6.0 Marshmallow_Android Audiomanager - Fatal编程技术网

Android 不推荐使用的AudioManger.setStreamMute的替代方案?

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

AudioManger.setStreamMute现在已被api 23弃用,最好使用
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进行调整是否有优势?两者都支持相同的语法。