android加速度计来测量速度 [英] android accelerometer to measure speed

查看:39
本文介绍了android加速度计来测量速度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用加速度计制作速度计,但由于某种原因代码崩溃了有人可以告诉我出了什么问题以及如何解决谢谢

im trying to make an speedometer using the accelerometer but for some reason the code is crashing can someone please tell me what is wrong and how to fix it thank you

这是logcat中的红色部分:

this is the red part in logcat:

05-14 13:03:55.826: INFO/ActivityManager(91): Start proc com.hanud.speedo for activity com.hanud.speedo/.speedometer: pid=2052 uid=10127 gids={}
05-14 13:03:56.806: DEBUG/AndroidRuntime(2052): Shutting down VM
05-14 13:03:56.806: WARN/dalvikvm(2052): threadid=1: thread exiting with uncaught exception (group=0x400207f0)
05-14 13:03:56.986: ERROR/AndroidRuntime(2052): FATAL EXCEPTION: main
05-14 13:03:56.986: ERROR/AndroidRuntime(2052): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.hanud.speedo/com.hanud.speedo.speedometer}: java.lang.ClassNotFoundException: com.hanud.speedo.speedometer in loader dalvik.system.PathClassLoader[/data/app/com.hanud.speedo-2.apk]
05-14 13:03:56.986: ERROR/AndroidRuntime(2052):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585)
05-14 13:03:56.986: ERROR/AndroidRuntime(2052):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
05-14 13:03:56.986: ERROR/AndroidRuntime(2052):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
05-14 13:03:56.986: ERROR/AndroidRuntime(2052):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
05-14 13:03:56.986: ERROR/AndroidRuntime(2052):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-14 13:03:56.986: ERROR/AndroidRuntime(2052):     at android.os.Looper.loop(Looper.java:123)
05-14 13:03:56.986: ERROR/AndroidRuntime(2052):     at android.app.ActivityThread.main(ActivityThread.java:4627)
05-14 13:03:56.986: ERROR/AndroidRuntime(2052):     at java.lang.reflect.Method.invokeNative(Native Method)
05-14 13:03:56.986: ERROR/AndroidRuntime(2052):     at java.lang.reflect.Method.invoke(Method.java:521)
05-14 13:03:56.986: ERROR/AndroidRuntime(2052):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
05-14 13:03:56.986: ERROR/AndroidRuntime(2052):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
05-14 13:03:56.986: ERROR/AndroidRuntime(2052):     at dalvik.system.NativeStart.main(Native Method)
05-14 13:03:56.986: ERROR/AndroidRuntime(2052): Caused by: java.lang.ClassNotFoundException: com.hanud.speedo.speedometer in loader dalvik.system.PathClassLoader[/data/app/com.hanud.speedo-2.apk]
05-14 13:03:56.986: ERROR/AndroidRuntime(2052):     at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243)
05-14 13:03:56.986: ERROR/AndroidRuntime(2052):     at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
05-14 13:03:56.986: ERROR/AndroidRuntime(2052):     at java.lang.ClassLoader.loadClass(ClassLoader.java:532)
05-14 13:03:56.986: ERROR/AndroidRuntime(2052):     at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
05-14 13:03:56.986: ERROR/AndroidRuntime(2052):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577)
05-14 13:03:56.986: ERROR/AndroidRuntime(2052):     ... 11 more
05-14 13:03:57.017: WARN/ActivityManager(91):   Force finishing activity com.hanud.speedo/.speedometer
05-14 13:03:57.526: WARN/ActivityManager(91): Activity pause timeout for HistoryRecord{4382d820 com.hanud.speedo/.speedometer}
05-14 13:04:05.666: DEBUG/dalvikvm(1890): GC_EXPLICIT freed 4544 objects / 322792 bytes in 288ms
05-14 13:04:07.796: WARN/ActivityManager(91): Activity destroy timeout for HistoryRecord{4382d820 com.hanud.speedo/.speedometer}
05-14 13:04:12.016: INFO/ActivityManager(91): Start proc com.android.email for service com.android.email/.service.MailService: pid=2058 uid=10004 gids={3003, 1015}

这是代码:

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

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;
import android.os.Handler;
import android.widget.TextView;

public class Speedometer extends Activity {

  Handler handler = new Handler();

  SensorManager sensorManager;
    TextView myTextView;

    float appliedAcceleration = 0;
    float currentAcceleration = 0;
    float velocity = 0;
    Date lastUpdate;    

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

      myTextView = (TextView)findViewById(R.id.myTextView);
      lastUpdate = new Date(System.currentTimeMillis());

      sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
      Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        sensorManager.registerListener(sensorEventListener,
                                       accelerometer,
                                       SensorManager.SENSOR_DELAY_FASTEST);


      Timer updateTimer = new Timer("velocityUpdate");
      updateTimer.scheduleAtFixedRate(new TimerTask() {
        public void run() {
          updateGUI();
        }
      }, 0, 1000);
    }

    private void updateGUI() {
      // Convert from meters per second to miles per hour.
      final double mph = (Math.round(100*velocity / 1.6 * 3.6))/100;

      // Update the GUI
      handler.post(new Runnable() {
      public void run() {
          myTextView.setText(String.valueOf(mph) + "mph");
      }
    });
    }

  private void updateVelocity() {
      // Calculate how long this acceleration has been applied.
      Date timeNow = new Date(System.currentTimeMillis());
      long timeDelta = timeNow.getTime()-lastUpdate.getTime();
      lastUpdate.setTime(timeNow.getTime());

      // Calculate the change in velocity at the 
      // current acceleration since the last update. 
      float deltaVelocity = appliedAcceleration * (timeDelta/1000);
      appliedAcceleration = currentAcceleration;

      // Add the velocity change to the current velocity.
      velocity += deltaVelocity;
    }

  //private final SensorListener sensorListener = new SensorListener() {
  private final SensorEventListener sensorEventListener = new SensorEventListener() {
    double calibration = Double.NaN;



      public void onSensorChanged(SensorEvent event) {
        double x = event.values[0];
        double y = event.values[1];
        double z = event.values[2];

      double a = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2) + Math.pow(z, 2)); 

      if (calibration == Double.NaN)
        calibration = a;
      else {
        updateVelocity();
        currentAcceleration = (float)a;
      }
    }
      public void onAccuracyChanged(Sensor sensor, int accuracy) { }
  };
}

推荐答案

您定义(可能在 android manifest 中)com.hanud.speedo.speedometer,而您的活动名称是 Speedometer(大写S).

You defined (probably in the android manifest) com.hanud.speedo.speedometer, while your activity's name is Speedometer (with capital S).

为了清楚起见 - 将清单文件中的活动名称更改为 Speedometer.

Just to make it clear - change the name of the activity in the Manifest file to Speedometer.

这篇关于android加速度计来测量速度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆