1

私は遊んでいてEqualizer、アプリケーションを起動してから別のイコライザーアプリを使用するたびに、何かを使用しようとするとアプリがクラッシュすることがわかりました(例setBandLevel)。

java.lang.UnsupportedOperationException: AudioEffect: android.media.audiofx.AudioEffect.checkStatus(AudioEffect.java:1244) で無効なパラメータ操作 android.media.audiofx.Equalizer.setBandLevel(Equalizer.java:230)

を聞いてonControlStatusChangeいますが、アプリが効果を制御できなくなったという情報があります。どうすれば元に戻すことができonResumeますか?

エフェクト インスタンスをクリア (リリースしてから無効化) し、エフェクト クラスを再度インスタンス化できると思いますが (以下のコード例のように)、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;
}
4

2 に答える 2

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
  }
}
于 2014-11-02T00:37:37.210 に答える