2014-11-01 2 views
1

Я играю с Equalizer и обнаружил, что всякий раз, когда я запускаю свое приложение, а затем используя другое приложение эквалайзера, мое приложение падает при попытке использовать что-либо (например, setBandLevel).Эквалайзер - как восстановить состояние управления

java.lang.UnsupportedOperationException: AudioEffect: недопустимая операция параметром при android.media.audiofx.AudioEffect.checkStatus (AudioEffect.java:1244) в android.media.audiofx.Equalizer.setBandLevel (Эквалайзер. 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; 
} 

ответ

0

Короткий ответ: вы не можете, но он работает с кодом я уже писал в Teh вопрос:

@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

Если ваше приложение работает в фоновом режиме, когда он выходит из строя, то, скорее всего, вы должны отказаться от эквалайзера в 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 
    } 
} 
+0

Спасибо за вашу поддержку, но он не срабатывает из-за ссылки «null». Я уточню свой вопрос. –

+0

исправьте меня, если я ошибаюсь - только одно приложение может иметь контроль над оборудованием, таким как эквалайзер, в любой момент времени. Итак, если другое приложение получило контроль над ним, тогда, когда ваше приложение станет «активным», вам придется повторно создать новый экземпляр, верно? Я не думаю, что сохранение состояния в onSaveInstanceState и восстановление его тоже поможет. –

+0

Я думаю то же самое, поэтому вопрос заключается в «если есть что-то вроде' setControlState (true) 'встроенная функциональность». Наверное, нет, и я могу только проверить, существует ли существующий экземпляр 'hasControl' и если он не воссоздает его с новым экземпляром. –

Смежные вопросы