首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >均衡器-如何恢复控制状态

均衡器-如何恢复控制状态
EN

Stack Overflow用户
提问于 2014-11-01 23:50:55
回答 2查看 938关注 0票数 1

我在玩Equalizer,发现每当我启动应用程序,然后使用另一个均衡器应用程序时,我的应用程序就会崩溃,试图使用任何东西(例如setBandLevel)。

android.media.audiofx.AudioEffect.checkStatus(AudioEffect.java:1244):android.media.audiofx.Equalizer.setBandLevel(Equalizer.java:230)上的java.lang.UnsupportedOperationException: AudioEffect:无效的参数操作

我正在听onControlStatusChange,我有信息说我的应用程序失去了对效果的控制。我怎样才能在onResume中收回它?

我假设我可以清除effect实例(发布后为built ),并再次实例化effect类v(如下面的代码示例所示),但我想知道是否有类似于setControlState(true)的功能内置。

代码语言:javascript
复制
@Override
protected void onResume() {
    super.onResume();
    if (mEqualizer.hasControl() == false) {
        prepareEqualizer();//force re-gaining control
    }
}

private void prepareEqualizer() {
    if (mEqualizer != null) {
        releaseEqualizer();
    }
    mEqualizer = new Equalizer(0, 0);
    mEqualizer.setEnabled(true);
    mEqualizer.setControlStatusListener(this);
    mEqualizer.setEnableStatusListener(this);
    mEqualizer.setParameterListener(this);
    mMaxBands = mEqualizer.getNumberOfBands();
    mGainLevels = mEqualizer.getBandLevelRange();

}

private void releaseEqualizer() {
    if (mEqualizer == null)
        return;
    mEqualizer.setControlStatusListener(null);
    mEqualizer.setEnableStatusListener(null);
    mEqualizer.setParameterListener(null);
    mEqualizer.release();
    mEqualizer = null;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-06 14:31:53

简短的回答是:你不能,但它适用于我已经在问题中发布的代码:

代码语言:javascript
复制
@Override
protected void onResume() {
    super.onResume();
    if (mEqualizer.hasControl() == false) {
        prepareEqualizer();//force re-gaining control
    }
}

private void prepareEqualizer() {
    if (mEqualizer != null) {
        releaseEqualizer();
    }
    mEqualizer = new Equalizer(0, 0);
    mEqualizer.setEnabled(true);
    mEqualizer.setControlStatusListener(this);
    mEqualizer.setEnableStatusListener(this);
    mEqualizer.setParameterListener(this);
    mMaxBands = mEqualizer.getNumberOfBands();
    mGainLevels = mEqualizer.getBandLevelRange();

}

private void releaseEqualizer() {
    if (mEqualizer == null)
        return;
    mEqualizer.setControlStatusListener(null);
    mEqualizer.setEnableStatusListener(null);
    mEqualizer.setParameterListener(null);
    mEqualizer.release();
    mEqualizer = null;
}
票数 0
EN

Stack Overflow用户

发布于 2014-11-02 00:37:37

如果应用程序崩溃时处于后台,那么最有可能的情况是,您应该放弃onPause()中的均衡器,该均衡器在应用程序进入后台之前被调用,而另一个应用程序则出现在前台。

代码语言:javascript
复制
@Override
protected void onPause() {
  super.onPause();
  if (mEqualizer != null) {
    // do what you have to do to free and de-alloc mEqualizer
  }
}

然后在onResume() -

代码语言:javascript
复制
@Override
protected void onResume() {
  super.onResume();
  if (mEqualizer == null) {
    // create new instance
    // initialize
    // use it
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26694519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档