java소스에서
package exam.sensor;
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.EditText;
public class SensorActivity extends Activity implements SensorEventListener {
EditText vi;
int count;
String str = String.format("%d",count);
private long lastTime;
private float speed;
private float lastX;
private float lastY;
private float lastZ;
private float x, y, z;
private static final int SHAKE_THRESHOLD = 800;
private static final int DATA_X = SensorManager.DATA_X;
private static final int DATA_Y = SensorManager.DATA_Y;
private static final int DATA_Z = SensorManager.DATA_Z;
private SensorManager sensorManager;
private Sensor accelerormeterSensor;
public void onCreate(Bundle savedInstanceState) {
vi = (EditText)findViewById(R.id.tv);
vi.setText(str);
super.onCreate(savedInstanceState);
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
accelerormeterSensor = sensorManager
.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
}
@Override
public void onStart() {
super.onStart();
if (accelerormeterSensor != null)
sensorManager.registerListener(this, accelerormeterSensor,
SensorManager.SENSOR_DELAY_GAME);
}
@Override
public void onStop() {
super.onStop();
if (sensorManager != null)
sensorManager.unregisterListener(this);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override
public void onSensorChanged(SensorEvent event) {
int count=0;
if(speed>SHAKE_THRESHOLD) {
count++;
str = String.format("%d",count);
vi.setText(str);
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
long currentTime = System.currentTimeMillis();
long gabOfTime = (currentTime - lastTime);
if (gabOfTime > 100) {
lastTime = currentTime;
x = event.values[SensorManager.DATA_X];
y = event.values[SensorManager.DATA_Y];
z = event.values[SensorManager.DATA_Z];
speed = Math.abs(x + y + z - lastX - lastY - lastZ) /
gabOfTime * 10000;
if (speed > SHAKE_THRESHOLD) {
// 이벤트 발생!!
}
lastX = event.values[DATA_X];
lastY = event.values[DATA_Y];
lastZ = event.values[DATA_Z];
}
}
}
}
}
main.xml소스에서..
<?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"
android:background="#FFFFFF"
>
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tv"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/count"/>
<TextView
android:id="@+id/vi"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
이런식으로 만들었는데....
실행시키면 Sensor 응용프로그램(exam.sensor프로세스)이 예상치 않게 중지되었습니다.다시 시도해 주세요.
라고 에러가 떠요... 소스에서 에러는 안뜨는데....
왜이런거죠,...
저가 진짜 초보라 소스도 완벽히 이해 못햇지만 실행되면 찾아보면서 이해하려고 노력하고 있는데...
이렇게 에러가뜨니 어떻게 해야할지 모르겟네요....
제발 도와주세요...
[2011-07-31 18:57:18 - Sensor] ------------------------------
[2011-07-31 18:57:18 - Sensor] Android Launch!
[2011-07-31 18:57:18 - Sensor] adb is running normally.
[2011-07-31 18:57:18 - Sensor] Performing exam.sensor.SensorActivity activity launch
[2011-07-31 18:57:18 - Sensor] Automatic Target Mode: launching new emulator with compatible AVD 'avd7'
[2011-07-31 18:57:18 - Sensor] Launching a new emulator with Virtual Device 'avd7'
[2011-07-31 18:57:23 - Emulator] 2011-07-31 18:57:23.827 emulator-arm[454:80b] Warning once: This application, or a library it uses, is using NSQuickDrawView, which has been deprecated. Apps should cease use of QuickDraw and move to Quartz.
[2011-07-31 18:57:26 - Sensor] ------------------------------
[2011-07-31 18:57:26 - Sensor] Android Launch!
[2011-07-31 18:57:26 - Sensor] adb is running normally.
[2011-07-31 18:57:26 - Sensor] Performing exam.sensor.SensorActivity activity launch
[2011-07-31 18:57:26 - Sensor] Automatic Target Mode: launching new emulator with compatible AVD 'avd7'
[2011-07-31 18:57:26 - Sensor] Launching a new emulator with Virtual Device 'avd7'
[2011-07-31 18:57:30 - Emulator] WARNING: Data partition already in use. Changes will not persist!
[2011-07-31 18:57:31 - Emulator] WARNING: SD Card image already in use: /Users/jong-ugchoe/.android/avd/avd7.avd/sdcard.img
[2011-07-31 18:57:32 - Emulator] WARNING: Cache partition already in use. Changes will not persist!
[2011-07-31 18:57:33 - Emulator] 2011-07-31 18:57:33.348 emulator-arm[466:80b] Warning once: This application, or a library it uses, is using NSQuickDrawView, which has been deprecated. Apps should cease use of QuickDraw and move to Quartz.
[2011-07-31 18:57:33 - Sensor] New emulator found: emulator-5556
[2011-07-31 18:57:33 - Sensor] Waiting for HOME ('android.process.acore') to be launched...
[2011-07-31 18:59:08 - Sensor] HOME is up on device 'emulator-5556'
[2011-07-31 18:59:08 - Sensor] Uploading Sensor.apk onto device 'emulator-5556'
[2011-07-31 18:59:08 - Sensor] Installing Sensor.apk...
[2011-07-31 18:59:24 - Sensor] Success!
[2011-07-31 18:59:24 - Sensor] Starting activity exam.sensor.SensorActivity on device emulator-5556
[2011-07-31 18:59:28 - Sensor] ActivityManager: Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=exam.sensor/.SensorActivity }
[2011-07-31 19:02:19 - Sensor] ------------------------------
[2011-07-31 19:02:19 - Sensor] Android Launch!
[2011-07-31 19:02:19 - Sensor] adb is running normally.
[2011-07-31 19:02:19 - Sensor] Performing exam.sensor.SensorActivity activity launch
[2011-07-31 19:02:19 - Sensor] Automatic Target Mode: launching new emulator with compatible AVD 'avd7'
[2011-07-31 19:02:19 - Sensor] Launching a new emulator with Virtual Device 'avd7'
[2011-07-31 19:02:22 - Emulator] 2011-07-31 19:02:22.864 emulator-arm[484:80b] Warning once: This application, or a library it uses, is using NSQuickDrawView, which has been deprecated. Apps should cease use of QuickDraw and move to Quartz.
[2011-07-31 19:02:22 - Sensor] New emulator found: emulator-5556
[2011-07-31 19:02:22 - Sensor] Waiting for HOME ('android.process.acore') to be launched...
[2011-07-31 19:02:24 - Sensor] emulator-5556 disconnected! Cancelling 'exam.sensor.SensorActivity activity launch'!
[2011-07-31 19:02:30 - Sensor] ------------------------------
[2011-07-31 19:02:30 - Sensor] Android Launch!
[2011-07-31 19:02:30 - Sensor] adb is running normally.
[2011-07-31 19:02:30 - Sensor] Performing exam.sensor.SensorActivity activity launch
[2011-07-31 19:02:30 - Sensor] Automatic Target Mode: launching new emulator with compatible AVD 'avd7'
[2011-07-31 19:02:30 - Sensor] Launching a new emulator with Virtual Device 'avd7'
[2011-07-31 19:02:32 - Emulator] 2011-07-31 19:02:32.352 emulator-arm[496:80b] Warning once: This application, or a library it uses, is using NSQuickDrawView, which has been deprecated. Apps should cease use of QuickDraw and move to Quartz.
[2011-07-31 19:02:32 - Sensor] New emulator found: emulator-5556
[2011-07-31 19:02:32 - Sensor] Waiting for HOME ('android.process.acore') to be launched...
[2011-07-31 19:03:11 - Sensor] HOME is up on device 'emulator-5556'
[2011-07-31 19:03:11 - Sensor] Uploading Sensor.apk onto device 'emulator-5556'
[2011-07-31 19:03:11 - Sensor] Installing Sensor.apk...
[2011-07-31 19:03:32 - Sensor] Success!
[2011-07-31 19:03:32 - Sensor] Starting activity exam.sensor.SensorActivity on device emulator-5556
[2011-07-31 19:03:35 - Sensor] ActivityManager: Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=exam.sensor/.SensorActivity }
이렇게 빨간색 친데가 오류인데요.... 오류 고치는법을 모르겠어요.....저가 아는건 자바소스 xml소스 뿐인데...
setContentView(R.layout.main); 가 빠졌네요
그리고
vi = (EditText)findViewById(R.id.tv);
vi.setText(str);
이 부분은 setContentView(R.layout.main); 다음에 적어주셔야 에러가 안납니다
먼저 뷰가 생성이 된 다음에 텍스트뷰를 수정할수 있으니까요
일단 코드전체를 올리기엔 너무 길거 같구요 수정해야할 부분만 알려드릴께요.
멤버 변수 선언 부분에 int count; 이걸 int count =0;으로 수정하시던지, 아니면 onCreate에서 count =0;을 추가하셔도 되구요
그리고,
onSensorChanged 를 아래 함수로 변경하세요
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
long currentTime = System.currentTimeMillis();
long gabOfTime = (currentTime - lastTime);
if (gabOfTime > 100) {
lastTime = currentTime;
x = event.values[SensorManager.DATA_X];
y = event.values[SensorManager.DATA_Y];
z = event.values[SensorManager.DATA_Z];
speed = Math.abs(x + y + z - lastX - lastY - lastZ) /
gabOfTime * 10000;
if (speed > SHAKE_THRESHOLD) {
count++;
str = String.format("%d", count);
vi.setText(str);
}
lastX = event.values[DATA_X];
lastY = event.values[DATA_Y];
lastZ = event.values[DATA_Z];
}
}
}
문제점은 SensorChanged가 호출될때마다 count를 0으로 초기화 하고 있었구요.
그리고 speed가 계산되지도 않았는데 speed > SHAKE_THRESHOLD 조건문으로 전체를 묶어놨기때문에
그 안으로 진입을 하지 못해서 생긴 일입니다.
그리고 딱히 오류가 생기는 사항은 아니지만
onCreate에
vi.setClickable(false);
vi.setFocusable(false);
이걸 추가해주시면 좀더 나을 것으로 보입니다.



