傳感器系統:SensorManager.java:實現傳感器系統核心的管理類SensorManagerSensor.java:單一傳感器的描述性文件SensorSensorEvent.java:表示傳感器系統的事件類SensorEventSensorEventListener.java:傳感器事件的監聽者SensorEventListener接口SensorListener.java:傳感器的監聽者SensorListener接口(不推薦使用)在這裏介紹一下加速度傳感器也就是重力傳感器:加速度傳感器又叫G-sensor,返回x、y、z三軸的加速度數值。
該數值包含地心引力的影響,單位是m/s^2。將手機平放在桌面上,x軸默認爲0,y軸默認0,z軸默認9.81。
將手機朝下放在桌面上,z軸爲-9.81。
將手機向左傾斜,x軸爲正值。
將手機向右傾斜,x軸爲負值。
將手機向上傾斜,y軸爲負值。
將手機向下傾斜,y軸爲正值。
測試代碼:
import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.app.Activity; import android.content.Context; import android.view.Menu; import android.widget.TextView; public class MainActivity extends Activity { private TextView XT,ZT,YT,ACT; private SensorManager sm; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //獲取組件 XT=(TextView)findViewById(R.id.XT); YT = (TextView)findViewById(R.id.YT); ZT = (TextView)findViewById(R.id.ZT); ACT = (TextView)findViewById(R.id.onAccuracyChanged); //創建一個SensorManager來獲取系統的傳感器服務 sm = (SensorManager)getSystemService(Context.SENSOR_SERVICE); //選取加速度感應器 int sensorType = Sensor.TYPE_ACCELEROMETER; /* * 註冊事件 * 參數1 :SensorEventListener監聽器 * 參數2 :Sensor 一個服務可能有多個Sensor實現,此處調用getDefaultSensor獲取默認的Sensor * 參數3 :模式 可選數據變化的刷新頻率 * */ sm.registerListener(mySensorListener,sm.getDefaultSensor(sensorType),SensorManager.SENSOR_DELAY_NORMAL); } public void onPause(){ sm.unregisterListener(mySensorListener); super.onPause(); } /* * SensorEventListener接口的實現,需要實現兩個方法 * 方法1 onSensorChanged 當數據變化的時候被觸發調用 * 方法2 onAccuracyChanged 當獲得數據的精度發生變化的時候被調用,比如突然無法獲得數據時 * */ final SensorEventListener mySensorListener = new SensorEventListener(){ //重寫onSensorChanged方法 public void onSensorChanged(SensorEvent sensorEvent){ if(sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER){ //圖解中已經解釋三個值的含義 float X_lateral = sensorEvent.values[0]; float Y_longitudinal = sensorEvent.values[1]; float Z_vertical = sensorEvent.values[2]; XT.setText("x="+X_lateral); YT.setText("y="+Y_longitudinal); ZT.setText("z="+Z_vertical); } } //重寫onAccuracyChanged方法 public void onAccuracyChanged(Sensor sensor , int accuracy){ ACT.setText("onAccuracyChanged被觸發"); } }; @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
測試結果:
可以看到x,y,z值的變化,設定一個閥值然後根據搖晃值判斷是否進行功能,就可以達到重力感應實現功能的效果
在這裏補充一個“重力感應類”,可以在程序中直接用的:
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
public class NewSensor implements SensorEventListener {
private SensorManager sm;//傳感器管理
private Sensor sensor;//傳感器
private Context context;//上下文
//重力感應監聽器
private OnShakeListener shakeListener;
//設置速度閥值
private final int SPEED_SHRESHOLD = 4000;
//兩次檢測的時間間隔
private final int UPTATE_INTERVAL_TIME = 70;
//上次檢測時間
private long lastUpdateTime;
public NewSensor(Context c){
this.context = c;
start();
}
//開始檢測
public void start(){
//獲取系統傳感器管理
sm = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
//獲得重力傳感器
sensor = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
//註冊
sm.registerListener(this, sensor, SensorManager.SENSOR_DELAY_GAME);
}
//停止檢測 (用此方法停止對加速度傳感器的使用)
public void stop(){
sm.unregisterListener(this);
}
//搖晃監聽接口
public interface OnShakeListener {
public void onShake();
}
@Override
public void onSensorChanged(SensorEvent event) {
//現在檢測時間
long currentUpdateTime = System.currentTimeMillis();
//兩次檢測的時間間隔
long timeInterval = currentUpdateTime - lastUpdateTime;
//判斷是否達到了檢測時間間隔
if(timeInterval < UPTATE_INTERVAL_TIME)
return;
//現在的時間變成last時間
lastUpdateTime = currentUpdateTime;
//獲取座標
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
//轉變
float lastx = x;
float lasty = y;
float lastz = z;
//獲取變化值
float changex = x-lastx;
float changey = y-lasty;
float changez = z-lastz;
//計算搖晃值
double speed = Math.sqrt(changex*changex + changey*changey + changez*changez)/timeInterval * 10000;
//判斷是否達到閥值
if(speed>SPEED_SHRESHOLD){
shakeListener.onShake();
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}
直接在主類裏面創建對象 然後在監聽裏可以實現(播放歌曲、切換圖片等功能)