1.Sensor Type
重力感應/加速度傳感器 (G-Sensor)
光感應 (Light-Sensor)
溫度感應
方向感應
磁場、
臨近性 java
2.如何實現Sensor編程
a.獲取系統服務(SENSOR_SERVICE)返回一個SensorManager 對象
sensormanager = (SensorManager)getSystemSeriver(SENSOR_SERVICE);
b.經過SensorManager對象獲取相應的Sensor類型的對象
sensorObject = sensormanager.getDefaultSensor(sensor Type);
c.聲明一個SensorEventListener 對象用於偵聽Sensor 事件,並重載onSensorChanged方法
SensorEventListener sensorListener = new SensorEventListener(){
};
d.註冊相應的SensorService
sensormanager.registerListener(sensorListener, sensorObject, Sensor TYPE);
e.銷燬相應的SensorService
sensormanager.unregisterListener(sensorListener, sensorObject);
f: SensorListener 接口是傳感器應用程序的中心。它包括兩個必需方法:
onSensorChanged(int sensor,float values[]) 方法在傳感器值更改時調用。
該方法只對受此應用程序監視的傳感器調用(更多內容見下文)。該方法的參數包括:一個整數,指示更改的傳感器;一個浮點值數組,表示傳感器數據自己。有些傳感器只提供一個數據值,另外一些則提供三個浮點值。方向和加速表傳感器都提供三個數據值。
當傳感器的準確性更改時,將調用 onAccuracyChanged(int sensor,int accuracy) 方法。參數包括兩個整數:一個表示傳感器,另外一個表示該傳感器新的準確值。 android
3.關於G-Sensor
Android 加速度傳感器的類型是 Sensor.TYPE_ACCELEROMETER
經過 android.hardware.SensorEvent 返回加速度傳感器值。
加速度傳感器返回值的單位是加速度的單位 m/s^2(米每二次方秒),有三個方向的值分別是
values[0]: x-axis 方向加速度
values[1]: y-axis 方向加速度
values[2]: z-axis 方向加速度
其中x,y,z方向的定義是以水平放置在的手機的右下腳爲參照系座標原點 編程
x 方向就是手機的水平方向,右爲正
y 方向就是手機的水平垂直方向,前爲正
y 方向就是手機的空間垂直方向,天空的方向爲正,地球的方向爲負
須要注意的是,因爲地球固有的重力加速度g (值爲9.8 m/s^2),
所以現實中實際加速度值應該是 z方向返回值 - 9.8 m/s^2.
好比你以 2 m/s^2 的加速度將手機拋起,這時z方向的返回值應該是 11.8 m/s^2.
反之若以手機以2 m/s^2 的加速度墜落,則z方向的返回值應該是 7.8 m/s^2.
x,y方向則沒有上述限制。 數組
我本身寫了一個相似於微信的搖一搖的效果,代碼以下, 微信
import android.app.Activity; import android.app.Service; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.os.Vibrator; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class Sensor extends Activity implements SensorEventListener{ private TextView tv =null; private Button button = null; private SensorManager sensorManager =null; private Vibrator vibrator = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sensor); tv = (TextView) findViewById(R.id.textview1); button = (Button) findViewById(R.id.button1); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub tv.setText("文本復原"); } }); sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); vibrator = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE); } @Override protected void onResume() { super.onResume(); sensorManager.registerListener(this, sensorManager.getDefaultSensor(android.hardware.Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onPause() { super.onPause(); sensorManager.unregisterListener(this); } @Override public void onSensorChanged(SensorEvent event) { int sensorType = event.sensor.getType(); //values[0]:X軸,values[1]:Y軸,values[2]:Z軸 float[] values = event.values; if(sensorType == android.hardware.Sensor.TYPE_ACCELEROMETER){ if((Math.abs(values[0])>17||Math.abs(values[1])>17||Math.abs(values[2])>17)){ Log.d("sensor ", "============ values[0] = " + values[0]); Log.d("sensor ", "============ values[1] = " + values[1]); Log.d("sensor ", "============ values[2] = " + values[2]); tv.setText("搖一搖"+"\n"+values[0]+"\n"+values[1]+"\n"+values[2]); //搖動手機後,再伴隨震動提示~~ vibrator.vibrate(500); } } } @Override public void onAccuracyChanged(android.hardware.Sensor sensor, int accuracy) { // TODO Auto-generated method stub } }