2015-04-27 53 views
0

我正在編寫一個顯示加速計讀數的應用程序,我昨天能夠在主要活動中編寫所有加速計代碼,並且它在模擬器和我的設備上正常工作。類中的加速計代碼

但今天我試圖讓一個包含所有加速度計代碼的類,並返回三個整數X,Y,Z的整數數組僅,讓我做,我認爲它`正確的,但每一個碼當我在模擬器上運行這個項目時,它總是給我0,0,0。 所以,我希望任何幫助,請。

活動代碼::

package com.example.accelerometer_sensor; 

import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 
import android.widget.TextView; 

public class MainActivity extends Activity { 

    int [] AccVal = new int[3]; 

    TextView acceleration; 

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

     AccelerometerClass acc = new AccelerometerClass(); 
     acc.AccelerometerInit(this); 
     AccVal =acc.Vals; 

     acceleration = (TextView)findViewById(R.id.acceleration); 


     acceleration.setText("X: "+acc.Vals[0]+ 
        "\nY: "+acc.Vals[1]+ 
        "\nZ: "+acc.Vals[2]); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 


} 

accelerometerClass:

package com.example.accelerometer_sensor; 

import android.content.Context; 
import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorManager; 

public class AccelerometerClass implements SensorEventListener 
{ 
    int [] Vals = new int[3]; 
    Sensor accelerometer; 
    SensorManager sm; 

    public void AccelerometerInit(Context context) 
    { 

     sm = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);  
     accelerometer=sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
     sm.registerListener(this, accelerometer,SensorManager.SENSOR_DELAY_NORMAL); 
    } 

    protected void onResume() { 

     sm.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL); 

    } 

    protected void onPause() { 

     sm.unregisterListener(this); 
    } 

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

    } 

    @Override 
    public void onSensorChanged(SensorEvent event) { 
     // TODO Auto-generated method stub 

     Vals[0]=(int)event.values[0]; 
     Vals[1]=(int)event.values[1]; 
     Vals[2]=(int)event.values[2]; 
    } 


} 

請我卡在這個問題隨着時間,任何幫助將升值。

+2

我認爲計算器是更好這個問題的地方。 – Evorlor

+0

你的模擬器是如何配置的?也許你應該在真實的手機上測試你的代碼,或者看看這個問題:[我怎樣才能在android模擬器中模擬加速計?](http://stackoverflow.com/questions/3921467/how-can-i-simulate-加速度計在Android模擬器) – martijnn2008

回答

0

我懷疑文本是在onSensorChanged事件被觸發之前寫入的。 所以它是這樣的......

  1. 註冊聽衆
  2. 輸入文字(在這一點上都爲0)
  3. 事件觸發,並改變X,Y,Z值

的文本已經寫好了,所以值不會更新。我可能是錯的,但你可以通過停止線程幾秒鐘來測試這個值,然後將值寫入文本字段中,其中Thread.sleep(2000); 2000以毫秒爲單位。

也可能是事件沒有發射。你可以在onSensorChanged()方法內部添加一行記錄到你的logcat來檢查這一點。

Log.d(TAG, "onSensorChanged method has been invoked"); 

編輯:我只是跑它。一切工作正常,但你沒有得到你想要的結果,因爲文本是在事件觸發前寫入的。當onSensorChanged()方法被調用時,您需要更新UI。

+0

謝謝你的回覆,但你能告訴我如何更新UI ??!謝謝 – user3903128

0

MainActivityAccelerometerClass

public class AccelerometerClass implements SensorEventListener 
{ 
    int [] Vals = new int[3]; 
    Sensor accelerometer; 
    SensorManager sm; 
public AccelerometerClass(Context context) 
{ 

    sm = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);  
    accelerometer=sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
    sm.registerListener(this, accelerometer,SensorManager.SENSOR_DELAY_NORMAL); 
} 

... 

// getter method 
public int getValue(int index) { 
    return this.Vals[index]; 
} 

}

訪問它實現getter方法爲對象Vals

public class MainActivity extends Activity { 

    int [] AccVal = new int[3]; 

    TextView acceleration; 

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

     // this one will call constructor of AccelerometerClass and initialise sensors 
     AccelerometerClass acc = new AccelerometerClass(getApplicationContext()); 



     acceleration = (TextView)findViewById(R.id.acceleration); 

     // access like this here 
     acceleration.setText("X: "+acc.getValue(0)+ 
        "\nY: "+acc.getValue(1)+ 
        "\nZ: "+acc.getValue(2)); 
    } 
} 

這將解決你的問題

+0

我做了你上面提到的,但它仍然在模擬器上3個零​​?任何helppp請 – user3903128

+0

你得到'onSensorChanged'事件?把日誌放到這個事件中去檢查 – Kushal

+0

先生,我已經把這一行放在onsensorChanged()方法中: Log.d(TAG,「onSensorChanged方法已被調用」); 當我試圖正常運行模擬器上的應用程序時,它會給我加載符號(圓形加載),並且不顯示任何內容。 ?!這意味着什麼? – user3903128