package com.example.mediaplayertest;import java.util.ArrayList;import java.util.List;import android.annotation.SuppressLint;import android.app.Activity;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Rect;import android.graphics.Paint.Style;import android.media.AudioManager;import android.media.MediaPlayer;import android.media.audiofx.BassBoost;import android.media.audiofx.Equalizer;import android.media.audiofx.PresetReverb;import android.media.audiofx.Visualizer;import android.os.Bundle;import android.view.Gravity;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.AdapterView.OnItemSelectedListener;import android.widget.ArrayAdapter;import android.widget.LinearLayout;import android.widget.SeekBar;import android.widget.Spinner;import android.widget.TextView;public class MediaPlayerTest extends Activity {private LinearLayout layout;private MediaPlayer mPlayer;//定义系统的示波器private Visualizer mVisualizer;//定义系统的均衡器private Equalizer mEqualizer;//定义系统的重低音控制器private BassBoost mBass;//定义系统的预设音场控制器private PresetReverb mPresetReverb;private List reverbNames = new ArrayList();private List reverbVals = new ArrayList();private TextView mInfoView;@SuppressLint("NewApi")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//设定控制音乐声音setVolumeControlStream(AudioManager.STREAM_MUSIC);layout = new LinearLayout(this);layout.setOrientation(LinearLayout.VERTICAL);setContentView(layout);//创建mediaplayer对像mPlayer = MediaPlayer.create(this, R.raw.meihuasannong);//衩始化示波器setupVisualizer();mVisualizer.setEnabled(true);//初始化均衡控制器setupEqualizer();//初始化重低音控制器setupBassBoost();//初始化预设音场控制器setupPresetReverb();//开始播放音乐mPlayer.start();}//音场控制器@SuppressLint("NewApi")private void setupPresetReverb() {//以MediaPlayer的AudioSessionId创建PresetReverb//相当于设置PresetReverb负责控制该MediaPlayermPresetReverb = new PresetReverb(0, mPlayer.getAudioSessionId());mPresetReverb.setEnabled(true);//设置启用音场控制器TextView prTitle = new TextView(this);prTitle.setText("音场");layout.addView(prTitle);//获取系统支持的所有预设音场for (short i = 0; i < mEqualizer.getNumberOfPresets(); i++) {reverbNames.add(i);reverbVals.add(mEqualizer.getPresetName(i));}//使用Spinner作为音场选择器Spinner sp = new Spinner(this);sp.setAdapter(new ArrayAdapter(MediaPlayerTest.this,android.R.layout.simple_spinner_item, reverbVals));sp.setOnItemSelectedListener(new OnItemSelectedListener() {@Overridepublic void onItemSelected(AdapterView<?> parent, View view,int position, long id) {//设置所选的音场mPresetReverb.setPreset(reverbNames.get(position));}@Overridepublic void onNothingSelected(AdapterView<?> parent) {}});layout.addView(sp);}@SuppressLint("NewApi")@Overrideprotected void onPause() {super.onPause();if(isFinishing() && mPlayer != null){mVisualizer.release();mEqualizer.release();mPresetReverb.release();mBass.release();mPlayer.release();mPlayer = null;}}//重低音控制器@SuppressLint("NewApi")private void setupBassBoost() {//以MediaPlayer的AudioSessionId创建BassBoost//相当于设置BassBoost负责控制该mediaplayermBass = new BassBoost(0, mPlayer.getAudioSessionId());mBass.setEnabled(true);//设置启用重低音效果TextView bbText = new TextView(this);bbText.setText("重低音:");layout.addView(bbText);//使用seekbar作为重低音的调整工具SeekBar bar = new SeekBar(this);//设置进度条的范围为0~1000bar.setMax(1000);bar.setProgress(0);bar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {//设置重低音的强度mBass.setStrength((short) progress);}});layout.addView(bar);}//均衡控制器@SuppressLint("NewApi")private void setupEqualizer() {//以MediaPlayer的AudioSessionId创建均衡器mEqualizer = new Equalizer(0, mPlayer.getAudioSessionId());//设置启用均衡器mEqualizer.setEnabled(true);TextView eqTitle = new TextView(this);eqTitle.setText("均衡器:");layout.addView(eqTitle);//获取均衡器的最大值和最小值final short minEQLevel = mEqualizer.getBandLevelRange()[0];short maxEQLevel = mEqualizer.getBandLevelRange()[1];//获取均衡器所支持的所有频率short brands = mEqualizer.getNumberOfBands();for (short i = 0; i < brands; i++) {//创建一个TextView,用于显示频率TextView eqTextView = new TextView(this);eqTextView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT));eqTextView.setGravity(Gravity.CENTER_HORIZONTAL);//设置该均衡控制器的频率eqTextView.setText(mEqualizer.getCenterFreq(i) / 1000 + "Hz");layout.addView(eqTextView);//创建一个LinearLayout,水平排列组件LinearLayout tmpLayout = new LinearLayout(this);tmpLayout.setOrientation(LinearLayout.HORIZONTAL);//显示均衡器最小值的textviewTextView minDbTextView = new TextView(this);minDbTextView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT));minDbTextView.setText((minEQLevel / 100) + "dB");//显示均衡器最大值的textviewTextView maxDbTextView = new TextView(this);maxDbTextView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT));maxDbTextView.setText((maxEQLevel / 100) + "dB");LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);layoutParams.weight = 1;//定义seekbar作为调整工具SeekBar bar = new SeekBar(this);bar.setLayoutParams(layoutParams);bar.setMax(maxEQLevel - minEQLevel);bar.setProgress(mEqualizer.getBandLevel(i));final short brand = i;bar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {//设置该频率的均衡值mEqualizer.setBandLevel(brand,(short) (progress + minEQLevel));}});tmpLayout.addView(minDbTextView);tmpLayout.addView(bar);tmpLayout.addView(maxDbTextView);layout.addView(tmpLayout);}}@SuppressLint("NewApi")private void setupVisualizer() {//创建MyVisualizerView组件,用于显示波形图final MyVisualizerView mVisualizerView = new MyVisualizerView(this);mVisualizerView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,(int) (160f * getResources().getDisplayMetrics().density)));//将组件添加到layout容器中layout.addView(mVisualizerView); mInfoView = new TextView(this);          String infoStr = "";                    int[] csr = Visualizer.getCaptureSizeRange();          if(csr != null)          {              String csrStr = "CaptureSizeRange: ";              for(int i = 0; i < csr.length; i ++)              {                  csrStr += csr[i];                  csrStr +=" ";              }              infoStr += csrStr;          }                    final int maxCR = Visualizer.getMaxCaptureRate();                    infoStr = infoStr + "\nMaxCaptureRate: " + maxCR;                    mInfoView.setText(infoStr);          layout.addView(mInfoView);  //以MediaPlayer的AudioSessionId创建Visualizer对像//相当于设置Visualizer负责显示该MediaPlayer的音频数据mVisualizer = new Visualizer(mPlayer.getAudioSessionId());mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]);mVisualizer.setDataCaptureListener(new Visualizer.OnDataCaptureListener() {@Overridepublic void onWaveFormDataCapture(Visualizer visualizer,byte[] waveform, int samplingRate) {mVisualizerView.updateVisualizer(waveform);}@Overridepublic void onFftDataCapture(Visualizer visualizer,byte[] fft, int samplingRate) {mVisualizerView.updateVisualizer(fft);}}, Visualizer.getMaxCaptureRate() / 2, true, false);} class MyVisualizerView extends View {private byte[] bytes;private float[] points;private Paint paint = new Paint();private Rect rect = new Rect();private byte type = 0;private boolean mFirst = true; public MyVisualizerView(Context context) {super(context);bytes = null;paint.setStrokeWidth(1f);paint.setAntiAlias(true);paint.setColor(Color.GREEN);paint.setStyle(Style.FILL);}public void updateVisualizer(byte[] fft) {if(mFirst )          {              mInfoView.setText(mInfoView.getText().toString() + "\nCaptureSize: " + fft.length);              mFirst = false;          } bytes = fft;        invalidate();}@Overridepublic boolean onTouchEvent(MotionEvent event) {if(event.getAction() != MotionEvent.ACTION_DOWN){return false;}type ++;if(type >= 3){type = 0;}return true;}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);if(bytes == null){return;}canvas.drawColor(Color.WHITE);System.out.println("height-->"+getHeight());rect.set(0, 0, getWidth(), getHeight());switch(type){case 0:for(int i = 0;i < bytes.length - 1;i ++){float left = getWidth() * i / (bytes.length - 1);float top = rect.height() - (byte)(bytes[i + 1] + 128) * rect .height() / 128;float right = left + 1;float bottom = rect.height();canvas.drawRect(left, top, right, bottom, paint);}break;case 1:for(int i = 0;i < bytes.length - 1;i += 18){float left = getWidth() * i / (bytes.length - 1);float top = rect.height() - (byte)(bytes[i + 1] + 128) * rect .height() / 128;float right = left + 6;float bottom = rect.height();canvas.drawRect(left, top, right, bottom, paint);}break;case 2:if(points == null || points.length < bytes.length * 4){points = new float[bytes.length * 4];}for(int i = 0;i < bytes.length - 1;i ++){points[i * 4] = rect.width() * i / (bytes.length -1);points[i * 4 + 1] = (rect.height() / 2) + ((byte) (bytes[i]+ 128)) * 128 / (rect.height() / 2 );points[i * 4 + 2] = rect.width() * (i + 1) / (bytes.length - 1);points[i * 4 + 3] = (rect.height() / 2) + ((byte) (bytes[i + 1] + 128)) * 128 /(rect.height()/ 2); }canvas.drawLines(points, paint);break;/*case 2://bytes = null;  paint.setStrokeWidth(8f);              paint.setAntiAlias(true);              paint.setColor(Color.rgb(0, 128, 255));          byte[] model = new byte[bytes.length / 2 + 1];          model[0] = (byte) Math.abs(bytes[0]);          for (int i = 2, j = 1; j < 48;)          {              model[j] = (byte) Math.hypot(bytes[i], bytes[i + 1]);              i += 2;              j++;          }          bytes = model; if(points == null || points.length < bytes.length * 4){points = new float[bytes.length * 4];}rect.set(0, 0, getWidth(),(int) (160f * getResources().getDisplayMetrics().density));final int baseX = rect.width()/48;              final int height = rect.height();             System.out.println("height===>"+height);for (int i = 0; i < 48 ; i++)              {                  if (bytes[i] < 0)                  {                      bytes[i] = 127;                  }                                    final int xi = baseX*i + baseX/2;                                    points[i * 4] = xi;                  points[i * 4 + 1] = height;                                    points[i * 4 + 2] = xi;                  points[i * 4 + 3] = height - bytes[i];              }  canvas.drawLines(points, paint);break;*/}}}}

需要下载请到这个地址:

点击打开链接

更多相关文章

  1. android 开源项目(城市定位)
  2. Android(安卓)SeekBar(拖动条)
  3. Android中TabHost的使用
  4. android 调用摄像头
  5. android setPersistent
  6. android,java代码设置背景色
  7. Android(安卓)Studio控件技巧汇总
  8. Android(安卓)设置StatusBar的颜色
  9. Android全屏设置的两种方式

随机推荐

  1. Android上面的百度地图使用步骤
  2. 搭建 Android(安卓)X86 系统,替代AVD模拟
  3. Android(安卓)NDK调试方式之一: adb logca
  4. picasso_强大的Android图片下载缓存库
  5. Android(安卓)GestureDetector手势识别类
  6. Android调用测试
  7. android animation
  8. Android上的OpenGL ES 使用错误 解决
  9. Android中RatingBar的自定义总结
  10. ubuntu环境下我的第一个android apk (201