【问题标题】:Equalizer - how to regain control state均衡器 - 如何重新获得控制状态
【发布时间】:2014-11-14 23:58:46
【问题描述】:

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

java.lang.UnsupportedOperationException: AudioEffect: 无效 参数操作在 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;
}

【问题讨论】:

    标签: android equalizer audioeffect


    【解决方案1】:

    如果您的应用在崩溃时处于后台,那么您很可能应该放弃 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
      }
    }
    

    【讨论】:

    • 感谢您的支持,但它崩溃不是因为“空”引用。我会更新我的问题。
    • 如果我错了,请纠正我 - 在任何给定时间,只有一个应用程序可以控制均衡器等硬件。因此,如果其他应用程序控制了它,那么当您的应用程序变为“活动”时,您将不得不重新创建新实例,对吗?我认为在 onSaveInstanceState 中保存状态并恢复它也无济于事。
    • 我也这么认为,所以问题是“是否有类似setControlState(true) 的内置功能”。可能没有,我只能检查现有实例 hasControl 是否存在,如果没有,则使用新实例重新创建它。
    • 我认为没有 setControlState() 或者它与文档中的相同。我最接近的是将priority 值设置得非常高,以便其他应用程序无法控制:) mEqualizer = new Equalizer(0, 0);
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-10
      • 2021-12-04
      • 1970-01-01
      • 2020-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多