我創建一個應用程序,利用加速度計數據的計算設備橫滾和俯仰。 這是我現在,還沒有編碼的側傾/俯仰計算。的Android加速度計在z AXYS讀取0無變化
只是檢查以查看哪個傳感器存在並列出這些在logcat中,檢查如果裝置具有加速計和實現一個簡單的輸出GUI(4個textviews,對應於3個軸和最大傳感器範圍)。
X和Y正確讀取電話靜止,並一次旋轉一個軸,並從0到9.5左右(這將對應於地球重力的正常9.8m/s2)。正如預期的那樣,搖動設備會使值超過9.8閾值。
Z加速(sensorEvent.values [2]),但是,是在大約0.032靜止的(允許稱之爲零)。搖晃,旋轉,一切都沒有把它扔到牆上產生絕對沒有變化......這使得我的任何計算滾動和瀝青的嘗試幾乎沒用......
這段代碼有什麼問題,或者應該我認爲這款手機有些問題(用我妻子的手機進行測試,結果完全相同)。
- 加速度計是一個KXTJ2-1009 3軸加速度計(其手機 唯一的物理傳感器)
電話是中國製造HTM電話(假定它的一個HTC克隆) (http://www.everbuying.com/product555984.html)
公共類MainActivity延伸ActionBarActivity實現SensorEventListener {
private TextView raw_x, raw_y, raw_z, acc_max; private boolean hasAccelerometer; private SensorManager senSensorManager; private Sensor senAccelerometer; private long lastUpdate = 0; private float last_x, last_y, last_z; private static final int SHAKE_THRESHOLD = 700; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); sMgr = (SensorManager) this.getSystemService(SENSOR_SERVICE); List<Sensor> list = sMgr.getSensorList(Sensor.TYPE_ALL); String data = new String(); for (Sensor sensor : list) { data += (sensor.getName() + "\n"); data += (sensor.getVendor() + "\n"); data += (sensor.getVersion() + "\n"); } Log.d(TAG, data); PackageManager manager = getPackageManager(); hasAccelerometer = manager.hasSystemFeature(PackageManager.FEATURE_SENSOR_ACCELEROMETER); if(hasAccelerometer) { senSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); senAccelerometer = senSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); senSensorManager.registerListener(this, senAccelerometer , SensorManager.SENSOR_DELAY_NORMAL); } Log.d(TAG,Float.toString(senAccelerometer.getMaximumRange())); initGui(); } @Override protected void onResume() { super.onResume(); senSensorManager.registerListener(this, senAccelerometer, SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onPause() { super.onPause(); } @Override public void onDestroy() { super.onDestroy(); } @Override public void onSensorChanged(SensorEvent sensorEvent) { Sensor mySensor = sensorEvent.sensor; if (mySensor.getType() == Sensor.TYPE_ACCELEROMETER) { long curTime = System.currentTimeMillis(); float x = (float) sensorEvent.values[0]; float y = (float) sensorEvent.values[1]; float z = (float) sensorEvent.values[2]; if ((curTime - lastUpdate) > 100) { long diffTime = (curTime - lastUpdate); lastUpdate = curTime; float speed = Math.abs(x + y + z - last_x - last_y - last_z)/ diffTime * 10000; if (speed > SHAKE_THRESHOLD) { //doSomething() } if(raw_x!=null){ raw_x.setText(Float.toString(x)); raw_y.setText(Float.toString(y)); raw_z.setText(Float.toString(z)); } last_x = x; last_y = y; last_z = z; } } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } private void initGui() { setContentView(R.layout.activity_main); raw_x = (TextView) findViewById(R.id.lbl_raw_x); raw_y = (TextView) findViewById(R.id.lbl_raw_y); raw_z = (TextView) findViewById(R.id.lbl_raw_z); acc_max = (TextView) findViewById(R.id.lbl_max); acc_max.setText(Float.toString(senAccelerometer.getMaximumRange())); }
}