我在玩Equalizer,发现每当我启动应用程序,然后使用另一个均衡器应用程序时,我的应用程序就会崩溃,试图使用任何东西(例如setBandLevel)。
android.media.audiofx.AudioEffect.checkStatus(AudioEffect.java:1244):android.media.audiofx.Equalizer.setBandLevel(Equalizer.java:230)上的java.lang.UnsupportedOperationException: AudioEffect:无效的参数操作
我正在听onControlStatusChange,我有信息说我的应用程序失去了对效果的控制。我怎样才能在onResume中收回它?
我假设我可以清除effect实例(发布后为built ),并再次实例化effect类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;
}发布于 2014-11-06 14:31:53
简短的回答是:你不能,但它适用于我已经在问题中发布的代码:
@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;
}发布于 2014-11-02 00:37:37
如果应用程序崩溃时处于后台,那么最有可能的情况是,您应该放弃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
}
}https://stackoverflow.com/questions/26694519
复制相似问题