이 작업을 4일째 하는데, 책만보고 답을 구할수 없어서 질문을 합니다.
main.java에서 동영상을 촬영하고,
Gsense.java에서 흔들림을 인식해서
main.java의 동영상 촬영을 중지할려고 합니다.
Gsense를 어떻게 thread로 만드는지,
그리고 흔들림값을 어떤식으로 main.java에 넘겨줄수 있는지 알고 싶습니다.
일단 흔들림이 있으면 Gsense.java에서 mCounter 를 일정하게 증가하도록 하였습니다.
쓰레드에 관해서 자바책이랑 안드로이드 책을 모두 읽어보았지만,
모르겠습니다.
 

main.java
public class main extends Activity {
private static final int STATE_IDLE = 0;
private static final int STATE_RECORDING = 1;

private static int RECORDING_STATE = STATE_IDLE;
private Preview mPreview;
private Button takeVideoButton;
private Button callvideoplayButton;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

mPreview = new Preview(this);

LayoutInflater inflater = getLayoutInflater();
RelativeLayout rl = (RelativeLayout)inflater.inflate(R.layout.main, null);

takeVideoButton = (Button)rl.findViewById(R.id.cameraButton);
takeVideoButton.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
mPreview.procVideo(RECORDING_STATE);
}
});

FrameLayout fl = new FrameLayout(this);
fl.addView(mPreview);
fl.addView(rl);
setContentView(fl);

callvideoplayButton = (Button)findViewById(R.id.videoButton);
callvideoplayButton.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
Intent intent = new Intent("com.pusan.action.PLAY_ACTION");
startActivity(intent);
}
});

}

class Preview extends SurfaceView implements SurfaceHolder.Callback {
SurfaceHolder mHolder;
Camera mCamera;
Context mCtx;
MediaRecorder mRecorder;

String filePath;
File videoFile = null;

Preview(Context context) {
super(context);
mCtx = context;
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceCreated(SurfaceHolder holder) {
mCamera = Camera.open();
try {
mCamera.setPreviewDisplay(holder);
} catch (IOException exception) {
mCamera.release();
mCamera = null;
}
}

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(320, 240);
mCamera.setParameters(parameters);
mCamera.startPreview();
}
public void surfaceDestroyed(SurfaceHolder holder) {
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}

private void initRecorder(){
filePath = Environment
.getExternalStorageDirectory()
.getPath()+ "/" + createName(System.currentTimeMillis());
try {
videoFile = new File(filePath);
videoFile.createNewFile();
} catch (IOException e){
e.printStackTrace();
}

mRecorder = new MediaRecorder();

mCamera.unlock();
mRecorder.setCamera(mCamera);

mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

mRecorder.setVideoSize(320, 240);
mRecorder.setVideoFrameRate(15);

mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);

mRecorder.setPreviewDisplay(mHolder.getSurface());
mRecorder.setOutputFile(filePath);

try {
mRecorder.prepare();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

private String createName(long dateTaken){
Date date = new Date(dateTaken);
SimpleDateFormat dateFormat =
new SimpleDateFormat("yyyy-MM-dd HH.mm.ss");
return dateFormat.format(date)+".3gp";
}

private void registerVideo(){
ContentValues values = new ContentValues();
values.put(Video.Media.TITLE, "Test video");
values.put(Video.Media.DISPLAY_NAME, videoFile.getName());
values.put(Video.Media.DATE_TAKEN, System.currentTimeMillis());
values.put(Video.Media.MIME_TYPE, "video/3gp");
values.put(Video.Media.DATA, videoFile.getPath());
values.put(Video.Media.SIZE, videoFile.length());
mCtx.getContentResolver().insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);
Toast.makeText(main.this, "비디오가 저장되었습니다.", Toast.LENGTH_SHORT).show();
}

public void procVideo(int state){
switch(state){
case STATE_IDLE:
initRecorder();
mRecorder.start();
RECORDING_STATE = STATE_RECORDING;
takeVideoButton.setText("중지");
break;

case STATE_RECORDING:
mRecorder.stop();
RECORDING_STATE = STATE_IDLE;
mRecorder.release();
registerVideo();
mCamera.lock();
takeVideoButton.setText("촬영");
break;
}
}
}
}

Gsenser.java
package com.pusan.blackbox;
import java.util.ArrayList;
import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
public class Gsenser extends Activity {
final static String TAG = "MotionCounter";
final static float G = SensorManager.STANDARD_GRAVITY;
SensorManager mSm;
int mCounter = 100;
long mApplyTime;
int mSenGap = 1000;
float mSenRange = 16.0f;
int mSenSpeed = 800;
ArrayList<AccelValue> arValue = new ArrayList<AccelValue>();
final static int MAXCOUNT = 20;
class AccelValue {
float[] value = new float[3];
long time;
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// TODO Auto-generated method stub
mSm = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
mSm.registerListener(mSensorListener, mSm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_GAME);
}

// 파괴되기 전까지 계속 동작해야 함
protected void onDestroy() {
super.onDestroy();
mSm.unregisterListener(mSensorListener);
}
SensorEventListener mSensorListener = new SensorEventListener() {
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
public void onSensorChanged(SensorEvent event) {
switch (event.sensor.getType()) {
case Sensor.TYPE_ACCELEROMETER:
// 가속값 큐 방식의 배열에 누적
AccelValue av = new AccelValue();
av.value[0] = event.values[0];
av.value[1] = event.values[1];
av.value[2] = event.values[2];
av.time = event.timestamp / 100000L;
if (arValue.size() == MAXCOUNT) {
arValue.remove(0);
}
arValue.add(av);
// 인식 간격이 지나지 않았으면 무시
long now = System.currentTimeMillis();
if (now - mApplyTime < mSenGap) {
break;
}

String result = "";
// 지정한 기간내에 각 방향 가속값의 최소, 최대값 및 진폭 계산
float[] min = new float[] { 100, 100, 100};
float[] max = new float[] { -100, -100, -100};
for (int i = arValue.size() - 1; i >= 0; i--) {
AccelValue v = arValue.get(i);
if (av.time - v.time > mSenSpeed) {
result += "검사 범위 = " + (arValue.size() -1) + " ~ " + i + "n";
break;
}
for (int j = 0; j < 3; j++) {
min[j] = Math.min(min[j], v.value[j]);
max[j] = Math.max(max[j], v.value[j]);
}
}
float[] diff = new float[3];
for (int j = 0; j < 3; j++) {
diff[j] = Math.abs(max[j] - min[j]);
result += "diff[" + j + "] = " + diff[j] + "n";
}

// X 축 흔들기 - 1증가
if (diff[0] > mSenRange) {
mApplyTime = now;
mCounter++;
arValue.clear();
break;
}
// Y 축 흔들기 - 3증가
if (diff[1] > mSenRange) {
mApplyTime = now;
mCounter = mCounter+3;
arValue.clear();
break;
}
// Z 축 흔들기 - 5증가
if (diff[2] > mSenRange) {
mApplyTime = now;
mCounter = mCounter+5;
arValue.clear();
break;
}
break;
}
}
};
float Deg2Rad(float deg) {
return (deg * (float)Math.PI) / 180;
}
}