Showing posts with label Environmental sensors. Show all posts
Showing posts with label Environmental sensors. Show all posts

How to Detect Noise in Android

This is a simple example to create an app to detect Noise. When Noise/Sound frequency cross thersold vaule, You will get an alert.

Follow these steps:
1. Create an android project.
2.Create a Main activity (NoiseAlert.java)
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.PowerManager;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

public class NoiseAlert extends Activity  {
        /* constants */
        private static final int POLL_INTERVAL = 300;
       
        /** running state **/
        private boolean mRunning = false;
        
        /** config state **/
        private int mThreshold;
        
        private PowerManager.WakeLock mWakeLock;

        private Handler mHandler = new Handler();

        /* References to view elements */
        private TextView mStatusView;
        private SoundLevelView mDisplay;

        /* data source */
        private SoundMeter mSensor;
        
        

     /****************** Define runnable thread again and again detect noise *********/
     
        private Runnable mSleepTask = new Runnable() {
                public void run() {
                    //Log.i("Noise", "runnable mSleepTask");
                        
                    start();
                }
        };
        
        // Create runnable thread to Monitor Voice
        private Runnable mPollTask = new Runnable() {
                public void run() {
                    
                        double amp = mSensor.getAmplitude();
                        //Log.i("Noise", "runnable mPollTask");
                        updateDisplay("Monitoring Voice...", amp);

                        if ((amp > mThreshold)) {
                              callForHelp();
                              //Log.i("Noise", "==== onCreate ===");
                              
                        }
                        
                        // Runnable(mPollTask) will again execute after POLL_INTERVAL
                        mHandler.postDelayed(mPollTask, POLL_INTERVAL);
                     
                }
        };
        
         /*********************************************************/
        
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                
                // Defined SoundLevelView in main.xml file
                setContentView(R.layout.main);
                mStatusView = (TextView) findViewById(R.id.status);
               
                // Used to record voice
                mSensor = new SoundMeter();
                mDisplay = (SoundLevelView) findViewById(R.id.volume);
                
                PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
                mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "NoiseAlert");
        }

        
        @Override
        public void onResume() {
                super.onResume();
                //Log.i("Noise", "==== onResume ===");
                
                initializeApplicationConstants();
                mDisplay.setLevel(0, mThreshold);
                
                if (!mRunning) {
                    mRunning = true;
                    start();
                }
        }

        @Override
        public void onStop() {
                super.onStop();
               // Log.i("Noise", "==== onStop ===");
               
                //Stop noise monitoring
                stop();
               
        }

        private void start() {
                //Log.i("Noise", "==== start ===");
            
                mSensor.start();
                if (!mWakeLock.isHeld()) {
                        mWakeLock.acquire();
                }
                
                //Noise monitoring start
                // Runnable(mPollTask) will execute after POLL_INTERVAL
                mHandler.postDelayed(mPollTask, POLL_INTERVAL);
        }

        private void stop() {
            Log.i("Noise", "==== Stop Noise Monitoring===");
                if (mWakeLock.isHeld()) {
                        mWakeLock.release();
                }
                mHandler.removeCallbacks(mSleepTask);
                mHandler.removeCallbacks(mPollTask);
                mSensor.stop();
                mDisplay.setLevel(0,0);
                updateDisplay("stopped...", 0.0);
                mRunning = false;
               
        }

       
        private void initializeApplicationConstants() {
                // Set Noise Threshold
                mThreshold = 8;
                
        }

        private void updateDisplay(String status, double signalEMA) {
                mStatusView.setText(status);
                //
                mDisplay.setLevel((int)signalEMA, mThreshold);
        }
        
        
        private void callForHelp() {
              
              //stop();
              
             // Show alert when noise thersold crossed
              Toast.makeText(getApplicationContext(), "Noise Thersold Crossed, do here your stuff.",
                      Toast.LENGTH_LONG).show();
        }

};
3.  Create the src/YOUR PACKAGE/SoundLevelView.java and paste following code :
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;

class SoundLevelView extends View {
        private Drawable mGreen;
        private Drawable mRed;
        private Paint mBackgroundPaint;
        
        private int mHeight;
        private int mWidth;
        
        private int mThreshold = 0;
        private int mVol = 0;
        
        
        public SoundLevelView(Context context, AttributeSet attrs) {
               super(context, attrs);
 
                mGreen  = context.getResources().getDrawable(
                          R.drawable.greenbar);
                mRed    = context.getResources().getDrawable(
                          R.drawable.redbar);
                
                mWidth  = mGreen.getIntrinsicWidth();
                setMinimumWidth(mWidth*10);
                
                mHeight = mGreen.getIntrinsicHeight();
                setMinimumHeight(mHeight);
                
                //Used to paint canvas background color
                mBackgroundPaint = new Paint();
                mBackgroundPaint.setColor(Color.BLACK);
        
        }
        
        public void setLevel(int volume, int threshold) {
                if (volume == mVol && threshold == mThreshold) return;
                mVol = volume;
                mThreshold = threshold;
                
                // invalidate Call onDraw method and draw voice points
                invalidate();
        }
        
        @Override
        public void onDraw(Canvas canvas) {
               
                canvas.drawPaint(mBackgroundPaint);
               
                for (int i=0; i<= mVol; i++) {
                        Drawable bar;
                        if (i< mThreshold) 
                            bar = mGreen;
                        else           
                            bar = mRed;
 
                        bar.setBounds((10-i)*mWidth, 0, (10-i+1)*mWidth, mHeight);
                        bar.draw(canvas);
                }
        }
}

     SoundLevelView class is used to draw a sound meter on view ( Called in main.xml file ).

4.  Create the src/YOUR PACKAGE/SoundMeter.java  to record noise/sound. and paste following code :
import java.io.IOException;
import android.media.MediaRecorder;

public class SoundMeter {
        // This file is used to record voice
        static final private double EMA_FILTER = 0.6;

        private MediaRecorder mRecorder = null;
        private double mEMA = 0.0;

        public void start() {
               
            if (mRecorder == null) {
                    
                        mRecorder = new MediaRecorder();
                        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
                        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                        mRecorder.setOutputFile("/dev/null");
                        
                        try {
                            mRecorder.prepare();
                        } catch (IllegalStateException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        
                       mRecorder.start();
                       mEMA = 0.0;
                }
        }
        
        public void stop() {
                if (mRecorder != null) {
                        mRecorder.stop();     
                        mRecorder.release();
                        mRecorder = null;
                }
        }
        
        public double getAmplitude() {
                if (mRecorder != null)
                        return  (mRecorder.getMaxAmplitude()/2700.0);
                else
                        return 0;

        }

        public double getAmplitudeEMA() {
                double amp = getAmplitude();
                mEMA = EMA_FILTER * amp + (1.0 - EMA_FILTER) * mEMA;
                return mEMA;
        }
}

4.  Open  AndroidMainifest.xml : 
     Add Permission
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

Thats it.
Note: You can run this apps only on live devices. But before installing this apps on your mobile, Please check the list of sensors running on you mobile
Read More

How to use Light Sensor Android

This is a simple example to create an app using Light Sensor. Here you will learn basics of Light Sensor.

Follow these steps:

1. Create an android project.
2.Create a Main activity (MainLight.java)
import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.TextView;

public class MainLight extends Activity implements SensorEventListener {
    private SensorManager mgr;
    private Sensor light;
    private TextView text;
    private StringBuilder msg = new StringBuilder(2048);

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mgr = (SensorManager) this.getSystemService(SENSOR_SERVICE);

        light = mgr.getDefaultSensor(Sensor.TYPE_LIGHT);
       
        text = (TextView) findViewById(R.id.text);
    }

    @Override
    protected void onResume() {
        mgr.registerListener(this, light, SensorManager.SENSOR_DELAY_NORMAL);
      super.onResume();
    }

    @Override
    protected void onPause() {
        mgr.unregisterListener(this, light);
      super.onPause();
    }

  public void onAccuracyChanged(Sensor sensor, int accuracy) {
    msg.insert(0, sensor.getName() + " accuracy changed: " + accuracy +
        (accuracy==1?" (LOW)":(accuracy==2?" (MED)":" (HIGH)")) + "\n");
    text.setText(msg);
    text.invalidate();
  }

  public void onSensorChanged(SensorEvent event) {
    msg.insert(0, "Got a sensor event: " + event.values[0] + " SI lux units\n");
    text.setText(msg);
    text.invalidate();
  }
}
3.  Create the resource res/layout/main.xml and paste following code
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"  android:layout_height="fill_parent" >
      <TextView  android:id="@+id/text" android:textSize="20sp"
        android:layout_width="fill_parent"  android:layout_height="wrap_content" />
    </LinearLayout>

 Thats it.
Note: You can run this apps only on live devices. But before installing this apps on your mobile, Please check the list of sensors running on you mobile

Read More