4
我嘗試使用加速度計做一個測速儀,但由於某些原因的代碼崩潰有人可以告訴我什麼是錯的,如何解決它 謝謝Android的加速度計來測量速度
這是紅色部分在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輸出中,當您的班級被命名爲「Speedometer」時,它會抱怨'ClassNotFoundException:com.hanud.speedo.speedometer'。 – harism 2011-05-14 17:18:42
即使你修復了你的代碼,它也不會很好地工作。積分加速度以確定速度極易產生誤差。 – 2011-05-14 17:37:53
速度結果是如何隨着加速度而變化的?它工作正常嗎? – Snake 2015-01-22 15:50:59