2011-05-14 81 views
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) { } 
    }; 
} 
+0

這聽起來更像是一個AndroidManifest.xml問題。在您的LogCat輸出中,當您的班級被命名爲「Speedometer」時,它會抱怨'ClassNotFoundException:com.hanud.speedo.speedometer'。 – harism 2011-05-14 17:18:42

+0

即使你修復了你的代碼,它也不會很好地工作。積分加速度以確定速度極易產生誤差。 – 2011-05-14 17:37:53

+0

速度結果是如何隨着加速度而變化的?它工作正常嗎? – Snake 2015-01-22 15:50:59

回答

6

你定義(可能在Android清單)com.hanud.speedo.speedometer,而您的活動名稱爲Speedometer(大寫S)。

只需說清楚 - 將清單文件中活動的名稱更改爲車速表

+0

上面的代碼是否需要AndroidManifest.xml中的任何權限? – Lucifer 2012-10-30 09:08:36