Android噪音检测系统

源码地址 :https://github.com/twjitm/Sakura.git
Android噪音检测系统是基于手机声音获取接口来获取声音分贝值,通过分贝值画出分贝曲线,这是给一个学姐做的毕设,,先看看效果吧!
这里写图片描述
这里写图片描述
分贝曲线图通过移动原理可实现左右移动,效果还可以吧!花一天时间完成的,
下面来看看核心代码吧!

package com.fb.fragment;

import java.util.Timer;

import org.achartengine.GraphicalView;

import android.R.integer;
import android.R.string;
import android.annotation.SuppressLint;
import android.graphics.Color;
import android.os.Handler;
import android.provider.MediaStore.Audio.Media;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.RelativeLayout.LayoutParams;

import com.example.blaudios.R;
import com.fb.activity.MainActivity;
import com.fb.base.BaseFragment;
import com.fb.util.BewriteUtil;
import com.fb.util.FbChartline;
import com.fb.util.MyMediaRecorder;
import com.fb.util.SuggestUtil;
import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.view.annotation.ViewInject;
/**
 * 
 * @author 曲线页面
 *
 */
public class CurveFragment extends BaseFragment implements OnClickListener{
	@ViewInject(R.id.left_temperature_curve)
	private LinearLayout left_temperature_curve;
	@ViewInject(R.id.title_textview)
	private TextView title_textview;
	@ViewInject(R.id.text_bewrite)
	private TextView text_bewrite;//环境描述
	@ViewInject(R.id.text_suggest)
	private TextView text_suggest;//对应环境下面的建议
	private GraphicalView  mView;
	private FbChartline mService;
	//private MyAudioRecord audioRecordDemo ;
	private MyMediaRecorder media;
	@ViewInject(R.id.lsschj)
	private TextView lsschj;
	@ViewInject(R.id.text_vip)//噪音等级
	private TextView text_vip;

	@ViewInject(R.id.text_decibel)
	private TextView text_decibel;
	@ViewInject(R.id.needle)
	private ImageView needleView;  //指针图片
	@ViewInject(R.id.bt_start)
	private Button    bt_start;

	private float     degree = 0.0f;  //记录指针旋转
	private boolean   is_start=true;
	@Override
	public void initData() {
		bt_start.setOnClickListener(this);
		//audioRecordDemo =new MyAudioRecord(handler);
		media=new MyMediaRecorder(handler);
	}

	@Override
	public View initView() {
		view=View.inflate(context, R.layout.fragment_main, null);
		ViewUtils.inject(this,view);
		title_textview.setText("噪音测试仪");
		bt_start.setText("开始测试");
		setChartLineView();
		return view;
	}
	@SuppressWarnings("deprecation")
	private void setChartLineView() {
		mService=new FbChartline(context);
		mService.setXYMultipleSeriesDataset("分贝图");
		mService.setXYMultipleSeriesRenderer(100, 100, "分贝图", "时间", "分贝数值",
				Color.BLACK, Color.BLACK, Color.RED, Color.BLACK);
		mView = mService.getGraphicalView();
		left_temperature_curve.addView(mView, new LayoutParams(
				LayoutParams.FILL_PARENT, LayoutParams.MATCH_PARENT));		
	}
	private int t = 0;
	@SuppressLint("HandlerLeak")
	BewriteUtil bewriteUtil=new BewriteUtil();
	SuggestUtil suggestUtil=new SuggestUtil();
	
	Handler handler=new Handler(){

		@SuppressLint("HandlerLeak")
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			case 0X00:
				if ("-Infinity".equals( msg.obj.toString())) {
					degree=0f;
				}else {
					degree =(Float.parseFloat( msg.obj.toString()));//获取到的值
				}
				
				mService.updateChart(t, degree);
				t+=5;
				Log.i("传递过来的参数", msg.obj.toString());
				//degree =(Float)msg.obj;
				//t+=1;
				String subString="";
				//数据采集格式化
				if (degree>100) {
					subString=String.valueOf(degree).substring(0, 3);
				}
				if (degree<10) {
					subString=String.valueOf(degree).substring(0, 1);
					
				}if (degree>10&&degree<100) {
					subString=String.valueOf(degree).substring(0, 2);
				} 
				if (degree<0) {
					subString="0";
				}
				text_decibel.setText(subString+" dB");
				if (degree>60) {
					text_decibel.setTextColor(Color.RED);
					text_bewrite.setTextColor(Color.RED);
					text_suggest.setTextColor(Color.RED);
				}else {
					text_suggest.setTextColor(Color.BLACK);
					text_bewrite.setTextColor(Color.BLACK);
					text_decibel.setTextColor(Color.WHITE);
				}
              
				Integer integer=Integer.parseInt(subString);
				
				String bweString=bewriteUtil.goBewrite(integer);
				int vip=bewriteUtil.getVip(integer);
				text_vip.setText("噪音:"+vip+"等级");
				String suggString= suggestUtil.getSuggsetByDb(integer);
			text_suggest.setText(suggString);
				text_bewrite.setText(bweString);
				RotateAnimation animation = new RotateAnimation(degree, 
						degree, Animation.RELATIVE_TO_SELF, 0.5f,
						Animation.RELATIVE_TO_SELF, 0.5f);
				animation.setDuration(1000);
				animation.setFillAfter(true);
				needleView.startAnimation(animation);
				break;
			default:
				break;
			}
		}
	};

	@Override
	public  void onClick(View v) {
		switch (v.getId()) {
		case R.id.bt_start:
			if (is_start) {
				bt_start.setText("停止测试");
				
				media.startRecord();
				is_start=false;
			}else {
				bt_start.setText("开始测试");
				media.stopRecord();
			is_start=true;
			}
			break;

		default: 
			break;
		}
	}
}

获取分贝值得方法:

package com.fb.util;


import java.io.File;
import java.io.IOException;
 

import android.media.MediaRecorder;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
 


public class MyMediaRecorder {
  private final String TAG = "MediaRecord";
  private MediaRecorder mMediaRecorder;
  public static final int MAX_LENGTH = 1000 * 60 * 10;// 最大录音时长1000*60*10;
  private String filePath;
  private Handler handler = new Handler();
  public MyMediaRecorder(Handler handler){
    this.filePath = "/dev/null";
    this.handler=handler;
  }
  public MyMediaRecorder(File file) {
    this.filePath = file.getAbsolutePath();
  }
  private long startTime;
  private long endTime;
  public void startRecord() {
    if (mMediaRecorder == null)
      mMediaRecorder = new MediaRecorder();
    try {
      mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
      mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
      mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
       mMediaRecorder.setOutputFile(filePath);
      mMediaRecorder.setMaxDuration(MAX_LENGTH);
      mMediaRecorder.prepare();
      mMediaRecorder.start();
      startTime = System.currentTimeMillis();
      updateMicStatus();
    } catch (IllegalStateException e) {
     
    } catch (IOException e) {
  
    }
  }
 
  /**
   * 停止录音
   *
   */
  public long stopRecord() {
    if (mMediaRecorder == null)
      return 0L;
    endTime = System.currentTimeMillis();
    Log.i("ACTION_END", "endTime" + endTime);
    mMediaRecorder.stop();
    mMediaRecorder.reset();
    mMediaRecorder.release();
    mMediaRecorder = null;
    Log.i("ACTION_LENGTH", "Time" + (endTime - startTime));
    return endTime - startTime;
  }
 

  private Runnable mUpdateMicStatusTimer = new Runnable() {
    public void run() {
      updateMicStatus();
    }
  };
 
  /**
   * 更新话筒状态
   *
   */
  private int BASE = 1;
  private int SPACE = 100;// 间隔取样时间
 
  private void updateMicStatus() {
    if (mMediaRecorder != null) {
      double ratio = (double)mMediaRecorder.getMaxAmplitude() /BASE;
      double db = 0;// 分贝
      if (ratio > 1)
        db = (20 * Math.log10(ratio))*0.7;
      Message message =Message.obtain();
      message.what=0X00;
      message.obj=db;
      handler.sendMessage(message);
      Log.d(TAG,"分贝值:"+db);
      handler.postDelayed(mUpdateMicStatusTimer, SPACE);
    }
  }
}

原理其实很简单,需要源码的小伙伴留下邮箱

评论 39
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值