由均衡器中的 java.lang.UnsupportedOperationException 引起

Caused by java.lang.UnsupportedOperationException in the equalizer

我正在尝试修复我的应用程序中的错误,但问题是我无法修复该错误 因为我无法重新创建崩溃但我能够获取日志并且我无法确定是什么问题我提到了与 UnsupportedOperationException 有关的问题但直到现在都没有成功任何提示指南都会有所帮助

Log1

Fatal Exception: java.lang.RuntimeException
Unable to create service com.musicplayer.music.audioplayer.PlayerService: 
java.lang.RuntimeException: AudioEffect: set/get parameter error
android.app.ActivityThread.handleCreateService (ActivityThread.java:2801)
android.app.ActivityThread.access00 (ActivityThread.java:155)
android.app.ActivityThread$H.handleMessage (ActivityThread.java:1400)
android.os.Handler.dispatchMessage (Handler.java:102)
android.os.Looper.loop (Looper.java:135)
android.app.ActivityThread.main (ActivityThread.java:5343)
java.lang.reflect.Method.invoke (Method.java)
java.lang.reflect.Method.invoke (Method.java:372)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run 
(ZygoteInit.java:905)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:700)

logcat 2

    Caused by java.lang.RuntimeException
 AudioEffect: set/get parameter error
android.media.audiofx.AudioEffect.<init> (AudioEffect.java:407)
android.media.audiofx.Virtualizer.<init> (Virtualizer.java:120)
com.musicplayer.music.audioplayer.equalizermerge.model.EqualizerApi.init 
(EqualizerApi.java:23)
com.musicplayer.music.audioplayer.PlayerService.onCreate 
(PlayerService.java:400)
android.app.ActivityThread.handleCreateService (ActivityThread.java:3141)
android.app.ActivityThread.access00 (ActivityThread.java:178)
android.app.ActivityThread$H.handleMessage (ActivityThread.java:1640)
android.os.Handler.dispatchMessage (Handler.java:111)
android.os.Looper.loop (Looper.java:214)
android.app.ActivityThread.main (ActivityThread.java:6102)
java.lang.reflect.Method.invoke (Method.java)
java.lang.reflect.Method.invoke (Method.java:372)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run 
(ZygoteInit.java:1028)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:823)

按照建议,我添加了来自 io.fabric EqualizerApi code

的完整日志猫

我找到了源代码的一个版本 (https://android.googlesource.com/platform/frameworks/base/+/5bb8f80/media/java/android/media/audiofx/AudioEffect.java),但行号与您的堆栈跟踪不匹配。

似乎在初始化音频效果引擎的本机代码实现时由于问题抛出了 UnsupportedOperationException。在我正在查看的代码中,异常消息显示 "Effect library not loaded"。我猜它是由以下原因之一引起的:

  • 加载路径中缺少必需的本机库。 (也许你没有把它包含在应用程序中......)

  • 可能是库的初始化代码有bug。


更新 - 更新的堆栈跟踪和错误消息表明问题是在您创建 Virtualizer 时发生的。该消息暗示这是由于参数错误造成的。

查看 AudioEffect 和 Virtualizer classes 的代码,似乎 Virtualizer 初始值设定项正在尝试从本机 API 检索参数以测试 Virtualizer 是否"strength" 支持参数。 API 似乎在说它甚至不理解应该说明强度参数是否受支持的参数 (!)

Virtualizer class 中指定参数编号附近的注释是这样说的:

// These constants must be synchronized with those in 
// frameworks/base/include/media/EffectVirtualizerApi.h

根据我推断的行为,这似乎不是真的。换句话说,我认为...不知何故...您使用的 Java API 版本与本机 API 的版本不匹配。

或者,发生这种情况的原因可能是这些设备上的 Virtualizer 支持已损坏。

我建议采用以下解决方法:

  1. 尝试在您的 init 方法中捕获运行时异常,并在设备上将 Virtualizer 功能视为禁用。

  2. 如果您知道有问题的设备是什么,请编写您的 init 方法,甚至不要尝试在这些设备上配置 Virtualizer。

  3. 根本不支持这些设备。 (他们老了吗?他们 运行 是 Android 的旧/维护不善的版本吗?他们甚至 值得 支持吗?)

问题也可能与以下问答之一有关:

  • Using audioSessionId value to instantiate AudioFx class?
  • UnsupportedOperationException AudioEffect: invalid parameter operation