傳感器--光照和加速度傳感器

使用簡介

第一步,獲取傳感器的SensorManager實例

SensorManager sensorManager= (SensorManager) getSystemService(Context.SENSOR_SERVICE);

第二步,調用相應的傳感器類型

  • 這裏以光照傳感器爲例
 Sensor sensor=sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);

第三步,我們需要藉助SensorEventListener對傳感器輸出信號進行監控

private SensorEventListener listener=new SensorEventListener() {
        //當傳感器檢測的數值發生變化的時候調用
        public void onSensorChanged(SensorEvent event) {
        }

        //當傳感器精度發生變化的時候調用
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
        }
    };
  • onSensorChanged(SensorEvent event)
  • 這個方法參數是一個數據,所有的傳感器輸出信息都是存放在這個數組裏面的

註冊和取消註冊傳感器監聽事件

  • 註冊的方法有三個參數
  • 第一個參數爲SensorEventListener的實例
  • 第二個參數爲Sensor的實例
  • 第三個參數爲傳感器的更新速率,可選值有四個:SENSOR_DELAY_UI ,SENSOR_DELAY_NORMAL ,SENSOR_DELAY_GAME,SENSOR_DELAY_FASTEST,它們的更新速率依次遞增的。
sensorManager.registerListener(listener,sensor,SensorManager.SENSOR_DELAY_NORMAL);
  • 一般我們在onDestory方法中調用取消註冊方法,釋放資源
    protected void onDestroy() {
        super.onDestroy();
        if (sensorManager!=null){
            sensorManager.unregisterListener(listener);
        }
    }

光照傳感器

public class MainActivity extends AppCompatActivity {

    public SensorManager sensorManager;
    private TextView textView;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sensorManager= (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        Sensor sensor=sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
        sensorManager.registerListener(listener,sensor,SensorManager.SENSOR_DELAY_NORMAL);
        textView= (TextView) findViewById(R.id.textView);

    }

    private SensorEventListener listener=new SensorEventListener() {
        //當傳感器檢測的數值發生變化的時候調用
        //光照強度的數值,就存放在數組參數的第一個
        public void onSensorChanged(SensorEvent event) {
            textView.setText(event.values[0]+"");
        }

        //當傳感器精度發生變化的時候調用
        public void onAccuracyChanged(Sensor sensor, int accuracy) {

        }
    };

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (sensorManager!=null){
            sensorManager.unregisterListener(listener);
        }
    }
}

加速度傳感器

public class MainActivity extends AppCompatActivity {

    private SensorManager sensorManager;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sensorManager= (SensorManager) getSystemService(SENSOR_SERVICE);
        Sensor sensor=sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        sensorManager.registerListener(listener,sensor,SensorManager.SENSOR_DELAY_NORMAL);
    }

    private SensorEventListener listener=new SensorEventListener() {
        //加速的分爲三個方向的,x,y,z
        //分別存放在數組參數的前三位,我們通過對其絕對值的判斷,來判斷用戶是否搖晃了手機,然後觸發相應的邏輯處理
        public void onSensorChanged(SensorEvent event) {
            float x=Math.abs(event.values[0]);
            float y=Math.abs(event.values[1]);
            float z=Math.abs(event.values[2]);
            if (x>15||y>15||z>15){
                Toast.makeText(MainActivity.this, "搖一搖啊搖一搖", Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {

        }
    };

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (sensorManager!=null){
            sensorManager.unregisterListener(listener);
        }
    }
}
  • 由於傳感器只能在真機上運行,所以這裏就不再發效果圖了,還請大家自行嘗試效果。
發佈了121 篇原創文章 · 獲贊 18 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章