에러가 나면서 run시키면 앱이 실행되지가 않네요..
검색해보니 매니페스트에 액티비티를 등록하라는 오류인 것 같은데
액티비티 name을 무엇으로 지정해줘야하는지 모르겠습니다..
03-25 19:57:18.512: E/AndroidRuntime(17027): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.speedometer_3/com.example.speedometer_3.SpeedometerActivity}: java.lang.ClassCastException: android.app.SearchManager cannot be cast to android.hardware.SensorManager
03-25 19:57:18.512: E/AndroidRuntime(17027): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2295)
03-25 19:57:18.512: E/AndroidRuntime(17027): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2349)
03-25 19:57:18.512: E/AndroidRuntime(17027): at android.app.ActivityThread.access$700(ActivityThread.java:159)
03-25 19:57:18.512: E/AndroidRuntime(17027): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316)
03-25 19:57:18.512: E/AndroidRuntime(17027): at android.os.Handler.dispatchMessage(Handler.java:99)
03-25 19:57:18.512: E/AndroidRuntime(17027): at android.os.Looper.loop(Looper.java:137)
03-25 19:57:18.512: E/AndroidRuntime(17027): at android.app.ActivityThread.main(ActivityThread.java:5419)
03-25 19:57:18.512: E/AndroidRuntime(17027): at java.lang.reflect.Method.invokeNative(Native Method)
03-25 19:57:18.512: E/AndroidRuntime(17027): at java.lang.reflect.Method.invoke(Method.java:525)
03-25 19:57:18.512: E/AndroidRuntime(17027): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187)
03-25 19:57:18.512: E/AndroidRuntime(17027): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
03-25 19:57:18.512: E/AndroidRuntime(17027): at dalvik.system.NativeStart.main(Native Method)
03-25 19:57:18.512: E/AndroidRuntime(17027): Caused by: java.lang.ClassCastException: android.app.SearchManager cannot be cast to android.hardware.SensorManager
03-25 19:57:18.512: E/AndroidRuntime(17027): at com.example.speedometer_3.SpeedometerActivity.onCreate(SpeedometerActivity.java:86)
03-25 19:57:18.512: E/AndroidRuntime(17027): at android.app.Activity.performCreate(Activity.java:5372)
03-25 19:57:18.512: E/AndroidRuntime(17027): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1104)
03-25 19:57:18.512: E/AndroidRuntime(17027): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2257)
소스는 다음과 같습니다.
public class SpeedometerActivity extends ActionBarActivity {
SensorManager sensors;//sensormanager 객체를 저장할 변수
TextView tvSpeed;//화면에 속도를 출력할 textvie 컨트롤을 참조할 변수
float velocity = 0f ; // 계산된 속도
float currentAcceleration = 0f; //현재가속도
float appliedAcceleration = 0f; // 적용된 가속도
Date lastUpdated; //마지막 계산 시간
Handler handler = null;
Timer timer = null;
private final SensorEventListener sensorEventListener =
new SensorEventListener(){
double calibrator = Double.NaN;
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy){
}
@SuppressWarnings("deprecation")
@Override
public void onSensorChanged(SensorEvent event){
double x = event.values[SensorManager.DATA_X];
double y = event.values[SensorManager.DATA_Y];
double z = event.values[SensorManager.DATA_Z];
double a =
(-1)* Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2) +
Math.pow(z, 2));
if(calibrator == Double.NaN){
calibrator =a;
}
else {
computeVelocity();
currentAcceleration = (float)a;
}
}
};
@SuppressLint("ServiceCast")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_speedometer);
//oncreate 이벤트 핸들러에서 registerListener() 메서드를 호출하여 센서가 발생시키는 이벤트를 감시할
//SensorEventListener 인터페이스를 등록합니다. 그리고 속도를 표시할 textview컨트롤을 덕고 갱신시간을 초기화합니다.
tvSpeed = (TextView)findViewById(R.id.text_meter);
lastUpdated = new Date(System.currentTimeMillis());
//밑에꺼때문임
//03-24 23:26:54.498: E/AndroidRuntime(22570): Caused by: java.lang.NullPointerException
sensors =
(SensorManager)getSystemService(SEARCH_SERVICE);
sensors.registerListener(sensorEventListener,
sensors.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_FASTEST);
//Timer를 통하여 매 1초에 한번씩 화면을 갱신하도록 학위해 이벤트 핸들러를 수정한다.
timer = new Timer("updateVelocity");
timer.scheduleAtFixedRate(new TimerTask(){
public void run(){
updateScreen();
}
}, 0, 1000);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment()).commit();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.speedometer, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment {
public PlaceholderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_speedometer,
container, false);
return rootView;
}
}
//속도변화를 계산하는 메서드.
private void computeVelocity(){
Date now = new Date(System.currentTimeMillis());
long timeGap = now.getTime() - lastUpdated.getTime();
lastUpdated.setTime(now.getTime());
float velocityGap = appliedAcceleration*(timeGap/1000);
appliedAcceleration = currentAcceleration;
velocity += velocityGap;
double kmh =(Math.round(100*velocity*3.6)) / 100; //가속도 센서의 단위가 m/s이므로 일반적인 속도 단위이 km/h로 표시하기위해 3.6곱함
tvSpeed.setText(String.valueOf(kmh) + "" +
getString(R.string.speed_unit));
}
//Handler 객체를 통해 화면을 갱신하는 updateScreen()메서드 구현
private void updateScreen(){
final double kmh = (Math.round(100* velocity *3.6)) /100;
handler.post(new Runnable(){
public void run(){
tvSpeed.setText(String.valueOf(kmh) + " " + getString(R.string.speed_unit));
}
});
}
}