Android 使用audioSessionId值实例化AudioFx类?

Android 使用audioSessionId值实例化AudioFx类?,android,audio,Android,Audio,我已经阅读了Android API,并尝试在互联网上搜索有关声明自定义的audioSessionId,然后使用该audioSessionId初始化AudioFx类,并为我的MediaPlayer或AudioTrack分配硬编码的audioSessionId 此方法允许我先创建AudioFx,然后将新的MediaPlayer或AudioTrack附加到此audioSessionId 我目前可以在Android 2.3.6上使用此方法,但在Android 4.x上,我遇到了初始化失败的错误,或者在其

我已经阅读了Android API,并尝试在互联网上搜索有关声明自定义的
audioSessionId
,然后使用该
audioSessionId
初始化AudioFx类,并为我的MediaPlayer或AudioTrack分配硬编码的
audioSessionId

此方法允许我先创建AudioFx,然后将新的MediaPlayer或AudioTrack附加到此
audioSessionId

我目前可以在Android 2.3.6上使用此方法,但在Android 4.x上,我遇到了初始化失败的错误,或者在其他ICS/JellyBean设备上,此错误是无声的,但调用函数会导致异常

三星Galaxy S II[安卓4.0.3]:[安卓4.0.4不再出现问题]

摩托罗拉Xoom[Android 4.1.2]
在构造函数之后,它似乎无声地失败了。然后调用getProperties()会崩溃

java.lang.RuntimeException: AudioEffect: set/get parameter error
    at android.media.audiofx.AudioEffect.checkStatus(AudioEffect.java:1247)
    at android.media.audiofx.Equalizer.getProperties(Equalizer.java:532)
Nexus4[Android 4.2.1]
使用audioSessionId=0一切正常,但使用任何其他数字,每次我尝试将预设、频带电平、低音增强更改为ON或虚拟化器更改为ON时,设备都会报告以下无声错误。所报告的效果ID因我试图修改的效果而异

W/AudioPolicyManagerBase(165): unregisterEffect() unknown effect ID 1381
2012年11月8日更新:
我可以将
audioSessionId
用作0。我知道它已被弃用,但它是使用权限工作的<代码>我应该使用音频会话id为0的AudioFx吗?

您应该查看:

显然,这是ICS中出现的一个未解决的问题,在JB中可能也没有解决

我应该使用音频会话id为0的AudioFx吗

它在某些情况下可能会起作用,但不要指望它在未来的Android版本上继续起作用。你已经在损害你的应用程序和Jellybean上其他应用程序之间的互操作性。只需看看以下内容:

我知道这个问题 如果有人想试试

这样做

 Equalizer eq=null;
 .
 .
 .
 .
 .
 //in any function before initialization do this
 if(eq!=null)
      eq.release();
 eq=new Equalizer(0, audiosessionid);

试一试

除了会话0(不推荐的全局会话)之外,我对AudioFlinger代码的理解表明,会话仅为实际执行音频IO的类创建,即AudioRecord、AudioTrack、MediaPlayer等。您应该创建这些类,然后获取它们的会话ID,然后附加效果


您为会话ID提供的任何其他值都将对应于不存在的音频会话,因此将失败。

如果您否决投票,至少有时间评论您否决投票的原因!有人只是到处投票否决了每一个悬赏案的问题和答案。。。我真的希望他们被禁止。你好,乔娜,你有什么解决办法吗。我还想在应用程序中实现音频效果,但出现了如上所述的错误。感谢链接,但我实际上发布了该错误:P@Android小丑:我已经看到了链接。我知道这个问题还没有解决,但是如果我想实现像低音、麻烦和均衡器这样的音频效果呢?请提供任何示范工程,所有。我已经看到你的答案第二次如此。你能帮我做一些描述和java代码来解决这个问题吗?我没有使用OP遇到问题的任何设备,所以我真的无法帮助解决任何问题。我添加我的答案只是为了解决使用音频会话0的风险,因为这是问题的一部分。
// suspend all effects in AUDIO_SESSION_OUTPUT_MIX when enabling any effect on
// another session. This gives the priority to well behaved effect control panels
// and applications not using global effects.
// Enabling post processing in AUDIO_SESSION_OUTPUT_STAGE session does not affect
// global effects
if ((sessionId != AUDIO_SESSION_OUTPUT_MIX) && (sessionId != AUDIO_SESSION_OUTPUT_STAGE)) {
    setEffectSuspended_l(NULL, enabled, AUDIO_SESSION_OUTPUT_MIX);
}
 Equalizer eq=null;
 .
 .
 .
 .
 .
 //in any function before initialization do this
 if(eq!=null)
      eq.release();
 eq=new Equalizer(0, audiosessionid);