安卓加速度计用于测量速度

4
我正在尝试使用加速度计制作一个速度表,但出现了代码崩溃的问题,有人能告诉我出了什么问题并如何解决吗?谢谢。
以下是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) { }
  };
}

这更像是一个 AndroidManifest.xml 的问题。在您的 LogCat 输出中,它抱怨 ClassNotFoundException: com.hanud.speedo.speedometer,而您的类名为 Speedometer - harism
即使你修复了代码,它也不会运行得很好。将加速度整合以确定速度极易积累误差。 - Chris Stratton
加速度的速度结果如何?它效果如何? - Snake
1个回答

6

你在Android清单文件中定义了com.hanud.speedo.speedometer,而你的Activity名称是Speedometer(大写字母S)。

为了明确起见,请将清单文件中Activity的名称更改为Speedometer


以上代码是否需要在 AndroidManifest.xml 文件中添加任何权限? - Lucifer
@Lucifer,它不需要任何权限,因为加速度计是几乎所有Android设备的一部分,并且所有设备都支持由操作系统驱动的该传感器。 - Zeeshan Shahid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接