2012-08-12 38 views
2

我試圖創建一個獨立的加速度計類,它保存加速計的值,並且我可以隨時從任何其他類訪問它們,但它似乎不起作用。Android加速計類

這裏是我的Accelerometer類:

import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 

public class Accelero implements SensorEventListener { 

    private float xAxis; 
    private float yAxis; 
    private float zAxis; 

    public float getX(){ 
     return this.xAxis; 
    } 

    public float getY(){ 
     return this.yAxis; 
    } 

    public float getZ(){ 
     return this.zAxis; 
    } 

    public void onAccuracyChanged(Sensor sensor, int accuracy) { 
     // TODO Auto-generated method stub 

    } 

    public void onSensorChanged(SensorEvent event) { 
      xAxis = event.values[0]; 
      yAxis = event.values[1]; 
      zAxis = event.values[2]; 
    } 

} 

所以你看,我想通過我創建get*();方法得到的值。但它似乎總是返回0, 0, 0。任何想法我的代碼有什麼問題?

這是,這是在使用的活動:

import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.widget.EditText; 

public class MainActivity extends Activity { 

    private EditText output; 
    private static int DIS = 1; 
    Accelero acc; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     output =(EditText) findViewById(R.id.editText1); 
     handler.sendEmptyMessageDelayed(DIS, 1); 
     acc = new Accelero(this); 

    } 

    private Handler handler = new Handler() { 

     @Override 
     public void handleMessage(Message msg) { 
      if (msg.what == DIS){ 
       refresh(); 
       handler.sendEmptyMessageDelayed(DIS, 1);  
      } 
     } 
    }; 

    public void refresh(){ 
     output.setText("X:"+acc.getX()+"\nY:"+acc.getY()+"\nZ:"+acc.getZ()); 
    } 
} 

我也有這個premission清單中:

<uses-feature android:name="android.hardware.sensor.accelerometer" android:required="true" /> 
+0

你註冊了聽衆嗎? – 2012-08-12 12:15:03

+0

你可以顯示使用這個類的活動的代碼嗎? – 2012-08-12 12:16:10

+0

我添加了代碼。 – 2012-08-12 12:25:32

回答

1

您必須註冊您使用的傳感器,在這種情況下是加速度計。 我猜你想要在「Accelero」類中加速度計的所有相關信息。

要註冊該類的偵聽器,您必須傳遞對您的活動的引用。所以,你應該構造看起來是這樣的:

SensorManager manager; 
Sensor accelerometer; 
Activity foo; 

public Accelero(Activity foo) { 
    this.foo = foo; 
    manager = (SensorManager) this.foo.getSystemService(Context.SENSOR_SERVICE); 
    accelerometer = manager.getSensorList(Sensor.TYPE_ACCELEROMETER).get(0); 
    manager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_GAME); 
} 

,當你創建一個Accelero對象,你只需通過this作爲參數。

我希望這會有所幫助。

+0

仍然給我0,0,0 – 2012-08-12 12:38:28

+0

在你調用super.OnCreate()之前不要創建Accelero對象。這是問題嗎? – 2012-08-12 12:38:37

+0

是的,這是我固定它。但現在它的直到只給了我0,0,0。它鎖定屏幕後再次解鎖 – 2012-08-12 12:39:51

1

您需要註冊的傳感器監聽到傳感器管理您的活動

public class Main extends Activity implements SensorEventListener { 
    private float mLastX, mLastY, mLastZ; 
    private boolean mInitialized; 

    private SensorManager mSensorManager; 

    private Sensor mAccelerometer; 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
     mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
     mSensorManager.registerListener(new Accelero(), mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL); 
    } 
} 

請參閱here瞭解詳細教程(代碼取自本教程)

+0

我是否在我的活動或加速計類中添加了這個? – 2012-08-12 12:25:14

+0

您需要在Activity的onCreate()中執行此操作。這樣你就告訴你的活動將加速度計的數據發送到這個類 – 2012-08-12 12:26:30