2014-11-01 86 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

簡短的回答是:你不能,但它的代碼我已經張貼在德問題的工作:

@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'引用而崩潰。我會更新我的問題。 – 2014-11-02 01:08:34

+0

糾正我,如果我錯了 - 在任何時候只有一個應用程序可以控制像Equalizer這樣的硬件。所以,如果其他應用程序獲得了對它的控制,那麼當您的應用程序變爲「活動」時,您將不得不重新創建新實例,對吧?我不認爲在onSaveInstanceState中保存狀態並恢復它也會有幫助。 – 2014-11-02 01:24:41

+0

我認爲是一樣的,所以問題是「如果有像'setControlState(true)'內置功能的東西」。可能沒有,我只能檢查現有的實例'hasControl',如果不是用新的實例重新創建它。 – 2014-11-02 01:39:29