已弃用的 AudioManger.setStreamMute 的替代方案?

     2023-04-14     221

关键词:

【中文标题】已弃用的 AudioManger.setStreamMute 的替代方案?【英文标题】:Alternative for deprecated AudioManger.setStreamMute? 【发布时间】:2016-01-08 12:48:11 【问题描述】:

AudioManger.setStreamMute 现在被 api 23 弃用,最好使用 AudioManager.adjustStreamVolumeAudioManager.ADJUST_MUTE.

我的问题是这种标志只支持 api 23 而我的应用程序最低 api 16。

还有其他方法可以使整个系统静音吗?

如果不是,为什么 google 会弃用这种方法?

【问题讨论】:

【参考方案1】:

我的做法是使用 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);

【讨论】:

但是对于小于 23 的 api,难道不应该有更好的解决方案吗? 这就是解决方案。如果 API 小于 23,else 将执行。我可以让它变得更好的唯一方法是将它包装在一个方法中。 通过说一个小于 23 的 api 更好的解决方案,我的意思是一种不被弃用的方法 - 'setStreamMute' 的替代方案。我知道可能没有,谢谢。 setStreamMute 在以前的版本中不被弃用。仅在 API 23 上。如果应用程序在使用低于 23 的 API 的手机上运行,​​它将按预期工作。 setStreamVolume 没有被弃用,那么调整过度设置是否有优势?两者都支持相同的语法。【参考方案2】:

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

对于setStreamMute,来自文档:

给定流的静音请求是 累积:AudioManager 可以接收来自的多个静音请求 一个或多个客户端,只有在相同的情况下,流才会取消静音 收到的取消静音请求数。

adjustStreamVolumeAudioManager.ADJUST_MUTE 似乎并非如此。换句话说,如果流的状态在您使用setStreamMute (stream, true) 将其静音之前已经静音,则立即使用setStreamMute (stream, false) 将使其处于静音状态,而adjustStreamVolumeAudioManager.ADJUST_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://***.com/questions/7908962/setstreammute-never-unmutes?rq=1
    audioManager.setStreamMute(stream, false);

这假设用户不太可能调用另一个应用来将流静音,并期望在您的应用取消静音后流保持静音(无论如何似乎没有办法检查这一点)。

顺便说一句,isStreamMute 方法之前是隐藏的,只是在 API 23 中未隐藏,因此可以将其用于此目的。

【讨论】:

GestureDetector 已弃用的问题

】GestureDetector已弃用的问题【英文标题】:GestureDetectorDeprecatedIssue【发布时间】:2012-10-0403:11:59【问题描述】:我有这个代码itemizedOverlay=newMyItemizedOverlay(drawable,this);itemizedOverlay.setGestureDetector(newGestureDetector(newMyGestureDetec 查看详情

替换已弃用的函数 glLineWidth()

】替换已弃用的函数glLineWidth()【英文标题】:ReplacementfordeprecatedfunctionglLineWidth()【发布时间】:2019-12-2009:07:54【问题描述】:我需要一个允许我控制线条宽度的属性或方法。有用且简单的函数glLineWidth()现已弃用:funcglLineWidth(_wi... 查看详情

如何修复已弃用的“按钮样式”

】如何修复已弃用的“按钮样式”【英文标题】:Howtofixdeprecated\'buttonstyle\'【发布时间】:2019-07-3007:48:39【问题描述】:使用Xcode11的Beta5我收到警告:"\'buttonStyle\'已弃用:直接使用具体的\'PrimitiveButtonStyle\'类型。"我尝试了几件... 查看详情

尝试替换已弃用的 loadnibnamed:owner

】尝试替换已弃用的loadnibnamed:owner【英文标题】:Tryingtoreplacedeprecatedloadnibnamed:owner【发布时间】:2013-10-2603:10:56【问题描述】:我正在尝试替换已弃用的[NSBundleloadNibNamed:@"Subscriptions"owner:self];用这个代替(唯一我能找到的东西是... 查看详情

是否有快速替代已弃用的“SKPaymentTransaction.transactionReceipt”?

】是否有快速替代已弃用的“SKPaymentTransaction.transactionReceipt”?【英文标题】:Isthereafastreplacementfordeprecate`SKPaymentTransaction.transactionReceipt`?【发布时间】:2014-05-1513:41:45【问题描述】:是否有快速替代已弃用的SKPaymentTransaction.tran... 查看详情

BitmapDrawable 已弃用的替代方案

】BitmapDrawable已弃用的替代方案【英文标题】:BitmapDrawabledeprecatedalternative【发布时间】:2012-04-1606:11:56【问题描述】:我有以下代码可以将可绘制对象旋转一定的度数。publicDrawablerotateDrawable(floatangle,Contextcontext)BitmaparrowBitmap=Bitm... 查看详情

如何更改已弃用的 beginSheetForDirectory 方法

】如何更改已弃用的beginSheetForDirectory方法【英文标题】:HowtochangeadeprecatedbeginSheetForDirectorymethod【发布时间】:2012-07-0715:49:38【问题描述】:我有一个使用beginSheetForDirectory:file:modalForWindow:modalDelegate:didEndSelector:contextInfo:的应用。... 查看详情

已弃用的 Plus.PeopleApi.load

】已弃用的Plus.PeopleApi.load【英文标题】:DeprecatedPlus.PeopleApi.load【发布时间】:2016-12-0904:41:42【问题描述】:既然Plus.API在GooglePlayServices9.4中已弃用,那么在Android应用程序上为经过身份验证的用户获取GooglePlus圈子的正确方法是... 查看详情

替换 Java Awt 已弃用的方法

】替换JavaAwt已弃用的方法【英文标题】:ReplacingJavaAwtdeprecatedmethod【发布时间】:2018-03-3016:17:56【问题描述】:我发现了一个非常旧的代码,其中包含一个已弃用的java方法。如何转换为新方法。publicbooleanmouseDown(Evente,intx,inty)//co... 查看详情

替代已弃用的 AudioManager.isWiredHeadsetOn?

】替代已弃用的AudioManager.isWiredHeadsetOn?【英文标题】:AlternativetothedeprecatedAudioManager.isWiredHeadsetOn?【发布时间】:2013-01-0207:43:44【问题描述】:方法AudioManager.isWiredHeadsetOn()从api级别14被弃用,我们现在如何检测是否连接了有线... 查看详情

已弃用的 AudioManger.setStreamMute 的替代方案?

】已弃用的AudioManger.setStreamMute的替代方案?【英文标题】:AlternativefordeprecatedAudioManger.setStreamMute?【发布时间】:2016-01-0812:48:11【问题描述】:AudioManger.setStreamMute现在被api23弃用,最好使用AudioManager.adjustStreamVolume和AudioManager.ADJU... 查看详情

什么是已弃用的 getSupportLoaderManager() 的适当替换?

】什么是已弃用的getSupportLoaderManager()的适当替换?【英文标题】:WhatistheappropriatereplacementofdeprecatedgetSupportLoaderManager()?【发布时间】:2018-12-2617:35:08【问题描述】:我知道getSupportLoaderManager已被弃用。但我想打电话:getSupportLoade... 查看详情

处理已弃用的 android.text.ClipboardManager

】处理已弃用的android.text.ClipboardManager【英文标题】:Dealingwithdeprecatedandroid.text.ClipboardManager【发布时间】:2011-12-2419:18:02【问题描述】:android.text.ClipboardManager自API级别11起已弃用,取而代之的是android.content.ClipboardManager(source)。... 查看详情

asyncio 中所有这些已弃用的“循环”参数是啥?

】asyncio中所有这些已弃用的“循环”参数是啥?【英文标题】:Whatareallthesedeprecated"loop"parametersinasyncio?asyncio中所有这些已弃用的“循环”参数是什么?【发布时间】:2020-02-2003:11:52【问题描述】:asyncio中的许多函数已... 查看详情

Alamofire 已弃用的代码

】Alamofire已弃用的代码【英文标题】:Alamofiredeprecatedcode【发布时间】:2016-08-2401:31:05【问题描述】:场景:基于Alamofire的网络应用。我在最新的项目构建中遇到了不推荐使用的代码通知。我将其追溯到Alamofire中的以下语句。我... 查看详情

Android Volley 已弃用的库

】AndroidVolley已弃用的库【英文标题】:AndroidVolleydeprecatedlib【发布时间】:2016-02-2706:39:07【问题描述】:我正在使用登录/注册制作一个安卓应用程序。我找到了一些教程,我想知道是否不推荐使用android.volley(lib)。【问题讨论】... 查看详情

Snapkit 常量替换已弃用的 .priorityMedium() .priorityHigh() .priorityLow()?

】Snapkit常量替换已弃用的.priorityMedium().priorityHigh().priorityLow()?【英文标题】:Snapkitconstantstoreplacedeprecated.priorityMedium().priorityHigh().priorityLow()?【发布时间】:2017-04-2721:34:22【问题描述】:Snapkit是否提供常量来替换已弃用的函数.p... 查看详情

为啥 C++ 已弃用的警告会打印两次?

】为啥C++已弃用的警告会打印两次?【英文标题】:WhydoC++deprecatedwarningsprinttwice?为什么C++已弃用的警告会打印两次?【发布时间】:2019-04-2115:12:23【问题描述】:如果我有namespacefooinlineintbar()return1119;__attribute__((deprecated))inlineintb... 查看详情