不支持的操作异常:AudioEffect:无效的参数操作。

7

在这行代码上,我的均衡器出现了UnsupportedOperationException错误:bassBoost.setStrength((short) bassBoostPos);

以下是代码:

equalizer = new Equalizer(0, 0);
if (equalizer != null) {
equalizer.setEnabled (isEqualizer);
numBands = equalizer.getNumberOfBands();
short r[] = equalizer.getBandLevelRange();
minLevel = r[0];
maxLevel = r[1];
bassBoost = new BassBoost (0, 0);

if(bassBoost != null) {
    bassBoost.setEnabled(bassBoostPos > 0 ? true : false);
    bassBoost.setStrength((short) bassBoostPos); 
}

这里是异常信息

java.lang.UnsupportedOperationException: AudioEffect: invalid parameter    
operation
at android.media.audiofx.AudioEffect.checkStatus(AudioEffect.java:1271)
at android.media.audiofx.BassBoost.setStrength(BassBoost.java:127)

我应该如何修复这个问题,使应用程序不会崩溃?我的意思是如何检查设备是否支持这个操作,如果不支持,我就跳过这一行。谢谢。


@Henry,如果你可以使用控制条件解决问题,捕获异常始终是最后考虑的事情。 - Jan Heinrich Reimer
@Heinrich,如果一个具体实现的接口或抽象类决定不实现某个操作,通常会抛出UnsupportedOperationException异常。客户端在调用该操作之前并不知道具体实现是否支持该操作。否则,它将必须了解所有现有(和未来的)具体实现。 - Henry
@Henry 关于Android的AudioEffect类,有时它们可以完美地工作,但有时它们不行,甚至在同一设备上也会抛出异常。 - Jan Heinrich Reimer
我也遇到了同样的异常,但在禁用默认均衡器后(在我的情况下是Lineage OS上的audiofx),它完美地工作了。所以我认为错误是由于已安装的均衡器引起的。是的,在我的情况下,当启用另一个系统均衡器时,“bassBoost.setEnabled(bassBoostPos> 0?true:false);”返回-5,否则返回0。对于Equalizer set enabled(),情况也是如此。如果系统有均衡器,则暂时解决方案是调用它,否则使用自己的。 - Meena Pintu
@MeenaPintu 你是如何禁用默认均衡器的? - Vince VD
我有一个预装的均衡器,所以无法卸载它,但可以通过 Android 设置手动禁用它。我没有尝试找到任何编程解决方案,而是使用了这个解决方案:如果已安装均衡器,则打开它,否则打开你自己的。@Vince - Meena Pintu
2个回答

4
在AudioEffect中,有三种错误类型。
1. AudioEffect.ERROR_BAD_VALUE 2. AudioEffect.ERROR_INVALID_OPERATION --> 这种情况是发生在你的案例中。 3. RuntimeException
为什么会出现AudioEffect.ERROR_BAD_VALUE?
由于参数值不正确导致操作失败。它会引发IllegalArgumentException并显示错误消息“AudioEffect:bad parameter value”。
为什么会出现AudioEffect.ERROR_INVALID_OPERATION?
由于在错误的状态下请求操作而导致操作失败。它会引发UnsupportedOperationException并显示错误消息“AudioEffect:invalid parameter operation”。
RuntimeException
它发生在运行时。它会显示错误消息“AudioEffect:set/get parameter error”。
主要在什么情况下会出现错误的状态?如何解决?
答:在完成均衡器的处理后,如果没有调用release()方法,则会出现错误的状态。因此,在释放后将均衡器对象设置为null。
如果您使用的是api 25,则需要更改它。这个错误在这个级别上经常发生。因此,如果可能,请更改它。
有时本地库不允许实例化新的AudioEffect。因为已经存在太多对象。这也会导致错误状态。
资源链接:
  1. https://dev59.com/TWkv5IYBdhLWcg3wiRMJ#10885407
  2. https://stackoverflow.com/a/40968149/2293534
  3. BassBoost.java类的分析

0
  1. 在设置强度之前,需要检查它是否被支持。为此,需要添加以下条件。

    if(bassBoost.getStrengthSupported()) { bassBoost.setStrength((short) bassBoostPos)); }

  2. 另外需要注意的是,BassBoost强度的值应该在0到1000的范围内,表示最轻微的效果到最强烈的效果。


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