均衡器 - 如何重新获得控制状态

时间:2014-11-01 23:50:56

标签: android equalizer audioeffect

我正在玩Equalizer并发现每当我启动我的应用程序然后使用其他均衡器应用程序时,我的应用程序会在尝试使用任何内容时崩溃(例如setBandLevel)。

  

java.lang.UnsupportedOperationException:AudioEffect:invalid   参数操作在   android.media.audiofx.AudioEffect.checkStatus(AudioEffect.java:1244)   在android.media.audiofx.Equalizer.setBandLevel(Equalizer.java:230)

我正在收听onControlStatusChange,并且我得知我的应用程序无法控制效果。我怎样才能在onResume中收回它?

我假设我可以清除效果实例(释放然后无效)并再次实例化效果类v(如下面的代码示例中所示),但是想知道是否有类似setControlState(true)内置功能的内容。

@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;
}

2 个答案:

答案 0 :(得分:0)

如果您的应用在崩溃时处于后台,那么很可能,您应该放弃onPause()中的均衡器,该应答器会在您的应用进入后台并且另一个应用进入前台之前被调用。

@Override
protected void onPause() {
  super.onPause();
  if (mEqualizer != null) {
    // do what you have to do to free and de-alloc mEqualizer
  }
}

然后在onResume() -

@Override
protected void onResume() {
  super.onResume();
  if (mEqualizer == null) {
    // create new instance
    // initialize
    // use it
  }
}

答案 1 :(得分:0)

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

@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;
}