I get stumbled at the part when i need to measure the time between the first and second "bang" (first sound being the bullet fired and the second the sound made by hiting the target). Because after i get the time took the bullet to reach the target i can calculate the speed by the well known formula : speed = distance/time. Please, some help ! Thanks !
Code:
package com.example.alex.soundrecorder;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import static java.lang.Thread.interrupted;
public class MainActivity extends AppCompatActivity {
Button resume, stop, record;
MediaRecorder mRecorder;
TextView mStatusView;
final Handler mHandler = new Handler();
Thread runner;
final Runnable updater = new Runnable() {
public void run() {
updateTv();
};
};
// Timer mTimer = new Timer();
// FirstSoundThread firstThread = new FirstSoundThread("First_Thread");
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mStatusView = (TextView) findViewById(R.id.status);
stop = (Button) findViewById(R.id.stop);
record = (Button) findViewById(R.id.record);
resume = (Button) findViewById(R.id.resume);
stop.setEnabled(false);
record.setEnabled(true);
resume.setEnabled(false);
record.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startRecorder();
threadStart();
record.setEnabled(false);
stop.setEnabled(true);
resume.setEnabled(false);
}
});
stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
stopRecorder();
record.setEnabled(false);
stop.setEnabled(false);
resume.setEnabled(true);
}
});
resume.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onResume();
record.setEnabled(false);
stop.setEnabled(true);
resume.setEnabled(false);
}
});
}
public void startRecorder() {
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 (java.io.IOException ioe) {
android.util.Log.e("soundrecorder", "IOException: " +
android.util.Log.getStackTraceString(ioe));
} catch (java.lang.SecurityException e) {
android.util.Log.e("soundrecorder", "SecurityException: " +
android.util.Log.getStackTraceString(e));
}
try {
mRecorder.start();
} catch (java.lang.SecurityException e) {
android.util.Log.e("soundrecorder", "SecurityException: " +
android.util.Log.getStackTraceString(e));
}
}
}
public void stopRecorder() {
if (mRecorder != null) {
mRecorder.stop();
mRecorder.release();
mRecorder = null;
}
}
public void onResume() {
super.onResume();
startRecorder();
}
private long startT, endT, diffT;
public void updateTv() {
int dB = (int) soundDb(0.1);
mStatusView.setText(Integer.toString((dB)) + " dB");
//double elapsedTime = mTimer.getElapsedTime();
//Log.d("soundrecorder", "Elapsed time is : " + elapsedTime);
/*try {
if(dB > 100 ) {
startT = System.currentTimeMillis();
//Thread.sleep(1);
if(dB > 100) {
endT = System.currentTimeMillis();
//Thread.sleep(1);
}
}
diffT = endT - startT;
} catch (Exception e) {
System.err.println("error ..");
}
Log.d("soundrecorder", "Difference is : " + diffT);
diffT = 0;*/
}
public double getAmplitude() {
if (mRecorder != null) {
return (mRecorder.getMaxAmplitude());
} else return 0;
}
public double soundDb(double ampl) {
return 20 * Math.log10(getAmplitude() / ampl);
}
public void threadStart() {
if (runner == null) {
runner = new Thread() {
public void run() {
while (runner != null) {
// try {
//Thread.sleep(10);
int dB = (int) soundDb(0.1);
if(dB > 100 ) {
startT = System.currentTimeMillis();
//Thread.sleep(1);
}
if(dB > 100) {
endT = System.currentTimeMillis();
//Thread.sleep(1);
}
diffT = endT - startT;
Log.d("soundrecorder", "Difference is : " + diffT);
//Thread.sleep(1);
// } catch (InterruptedException e) {
// System.out.println(e);
// }
mHandler.post(updater);
}
}
};
runner.start();
Log.d("soundrecorder", "start runner()");
} else {
if (!interrupted()) {
runner.interrupt();
}
}
}
}
Last edited: