android eqaulizer 导致 NoClassDefFoundError: android.media.audiofx.Visualizer 错误
我正在尝试使用可视化和均衡器制作一个 android MediaPlayer
从以下教程
我正在尝试的代码是
@TargetApi(Build.VERSION_CODES.GINGERBREAD)
public class equalizer extends Activity {
/** Called when the activity is first created. */
private static final String TAG = "AudioFxDemo";
private static final float VISUALIZER_HEIGHT_DIP = 50f;
private MediaPlayer mp;
private Visualizer mVisualizer;
private Equalizer mEqualizer;
private LinearLayout ll;
private VideoView vv;
private VisualizerView mVisualizerView;
private TextView tv;
@TargetApi(Build.VERSION_CODES.GINGERBREAD)
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setVolumeControlStream(AudioManager.STREAM_MUSIC);
tv=new TextView(this);
vv=new VideoView(this);
ll=new LinearLayout(this);
ll.setOrientation(LinearLayout.VERTICAL);
ll.addView(tv);
setContentView(ll);
mp=MediaPlayer.create(getApplicationContext(), R.raw.song01);
// Log.d(TAG, "MediaPlayer audio session ID: " + mp.getAudioSessionId());
setupVisualizer();
setupEqualizer();
mVisualizer.setEnabled(true);
mp.setOnCompletionListener(new OnCompletionListener()
{
@Override
public void onCompletion(MediaPlayer arg0) {
// TODO Auto-generated method stub
mVisualizer.setEnabled(false);
}
});
mp.start();
tv.setText("playing audio");
}
public void setupEqualizer()
{
mEqualizer=new Equalizer(0,mp.getAudioSessionId());
mEqualizer.setEnabled(true);
TextView tv=new TextView(this);
tv.setText("equalizer");
ll.addView(tv);
short bands=mEqualizer.getNumberOfBands();
final short min=mEqualizer.getBandLevelRange()[0];
final short max=mEqualizer.getBandLevelRange()[1];
for(short i=0;i<bands;i++)
{
final short band=1;
TextView tv1=new TextView(this);
tv1.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT));
tv1.setGravity(Gravity.CENTER_HORIZONTAL);
tv1.setText((mEqualizer.getCenterFreq(band)/1000)+"hz");
ll.addView(tv1);
LinearLayout lv=new LinearLayout(this);
lv.setOrientation(LinearLayout.HORIZONTAL);
//TextView tv2=new TextView(this);
//tv2.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT));
//tv2.setText((min/100)+"db");
//TextView tv3=new TextView(this);
//tv3.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT));
//tv3.setText((max/100)+"db");
LinearLayout.LayoutParams param=new LinearLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
param.weight=1;
SeekBar bar=new SeekBar(this);
bar.setLayoutParams(param);
bar.setMax(max-min);
bar.setProgress(mEqualizer.getBandLevel(band));
bar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// TODO Auto-generated method stub
mEqualizer.setBandLevel(band, (short)(progress+min));
}
});
//lv.addView(tv2);
//lv.addView(tv3);
lv.addView(bar);
ll.addView(lv);
}
}
public void setupVisualizer()
{
mVisualizerView=new VisualizerView(this);
mVisualizerView.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT,
(int)(VISUALIZER_HEIGHT_DIP * getResources().getDisplayMetrics().density)));
/*vv.getBackground();
ll.addView(vv);*/
ll.addView(mVisualizerView);
mVisualizer=new Visualizer(mp.getAudioSessionId());
mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]);
mVisualizer.setDataCaptureListener(new Visualizer.OnDataCaptureListener() {
@Override
public void onWaveFormDataCapture(Visualizer visualizer, byte[] bytes,
int samplingRate) {
// TODO Auto-generated method stub
mVisualizerView.updateVisualizer(bytes);
}
@Override
public void onFftDataCapture(Visualizer visualizer, byte[] fft,
int samplingRate) {
// TODO Auto-generated method stub
}
}, Visualizer.getMaxCaptureRate()/2, true,false);
}
protected void onPause() {
super.onPause();
if (isFinishing() && mp != null) {
mVisualizer.release();
mEqualizer.release();
mp.release();
mp = null;
}
}
}
class VisualizerView extends View {
private byte[] mBytes;
private float[] mPoints;
private Rect mRect = new Rect();
private Paint mForePaint = new Paint();
public VisualizerView(Context context) {
super(context);
init();
}
private void init() {
mBytes = null;
mForePaint.setStrokeWidth(1f);
mForePaint.setAntiAlias(true);
mForePaint.setColor(Color.rgb(0, 128, 255));
}
public void updateVisualizer(byte[] bytes) {
mBytes = bytes;
invalidate();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (mBytes == null) {
return;
}
if (mPoints == null || mPoints.length < mBytes.length * 4) {
mPoints = new float[mBytes.length * 4];
}
mRect.set(0, 0, getWidth(), getHeight());
for (int i = 0; i < mBytes.length - 1; i++) {
mPoints[i * 4] = mRect.width() * i / (mBytes.length - 1);
mPoints[i * 4 + 1] = mRect.height() / 2
+ ((byte) (mBytes[i] + 128)) * (mRect.height() / 2) / 128;
mPoints[i * 4 + 2] = mRect.width() * (i + 1) / (mBytes.length - 1);
mPoints[i * 4 + 3] = mRect.height() / 2
+ ((byte) (mBytes[i + 1] + 128)) * (mRect.height() / 2) / 128;
}
canvas.drawLines(mPoints, mForePaint);
}
}
但它会导致上述错误
这是原木猫
07-09 17:49:41.090: E/AndroidRuntime(425): FATAL EXCEPTION: main
07-09 17:49:41.090: E/AndroidRuntime(425): java.lang.NoClassDefFoundError: android.media.audiofx.Visualizer
07-09 17:49:41.090: E/AndroidRuntime(425): at com.example.createplaylist.equalizer.setupVisualizer(equalizer.java:143)
07-09 17:49:41.090: E/AndroidRuntime(425): at com.example.createplaylist.equalizer.onCreate(equalizer.java:55)
07-09 17:49:41.090: E/AndroidRuntime(425): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
07-09 17:49:41.090: E/AndroidRuntime(425): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
07-09 17:49:41.090: E/AndroidRuntime(425): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
07-09 17:49:41.090: E/AndroidRuntime(425): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
07-09 17:49:41.090: E/AndroidRuntime(425): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
07-09 17:49:41.090: E/AndroidRuntime(425): at android.os.Handler.dispatchMessage(Handler.java:99)
07-09 17:49:41.090: E/AndroidRuntime(425): at android.os.Looper.loop(Looper.java:123)
07-09 17:49:41.090: E/AndroidRuntime(425): at android.app.ActivityThread.main(ActivityThread.java:4627)
07-09 17:49:41.090: E/AndroidRuntime(425): at java.lang.reflect.Method.invokeNative(Native Method)
07-09 17:49:41.090: E/AndroidRuntime(425): at java.lang.reflect.Method.invoke(Method.java:521)
07-09 17:49:41.090: E/AndroidRuntime(425): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
07-09 17:49:41.090: E/AndroidRuntime(425): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
07-09 17:49:41.090: E/AndroidRuntime(425): at dalvik.system.NativeStart.main(Native Method)