Android 感應器 (詳解二)—— 常用感應器
方向感應器 Orientation (現在幾乎已經不用了,因為其實不存在真正的方向) 磁場感應器 Magnetic Field 溫度感應器 Temperature 光感應器 Light 壓力感應器 Pressure1.方向感應器 Orientation:
用途:
方向感應器用於感應手機裝置的擺放狀態。比如手機頂部的朝向,手機目前的傾斜角度等:藉助於方向感應器,可以開發指南針、水平儀。(註:現在我們一般不用方向感應器來做指南針)
方向感應器返回的三個角度說明:
第一個:表示手機頂部朝向與正北方的夾角。(比如手機繞Z軸旋轉時,該角度發生變化) 第二個:表示手機頂部或底部翹起的角度(比如手機繞X軸傾斜時,該角度值變化-180~180,手機頂部抬起變負值) 第三個:表示表示手機左側或右側翹起的角度(當手機繞Y軸傾斜時,該角度值發生變化範圍-90~90,左側抬起變負值)2.磁場感應器 Magnetic Field:用途:
用於讀取手機裝置外部的磁場強度。隨著手機裝置擺放狀態的改變,周圍磁場在手機的X,Y,Z三個方向上的影響會發生改變。
磁場感應器會返回三個資料: 分別代表周圍磁場分解到X,Y,Z三個方向上的磁場分量。
這裡就不詳細介紹了,後面我們用指南針的執行個體一起來介紹磁場感應器的使用吧。
3.溫度感應器 Temperature :用途:
溫度感應器用於獲得手機裝置所處環境的溫度。
溫度感應器會返回一個資料,該資料代表手機裝置周圍的溫度,單位是攝氏度。4.光感應器 Light:用途:
用於獲得手機裝置所處環境的光的強度。
返回一個資料,代表手機裝置周圍的光的強度,該資料單位是勒克斯(lux)5.壓力感應器 Pressure:用途:
用於擷取手機裝置所處環境的壓力的大小。
返回一個資料,代表手機裝置周圍的壓力的大小。執行個體:
功能:這裡利用幾個文字框來顯示不同的感應器的值。
sensorAcitivity:
package com.example.myapplication.activitys;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import android.hardware.SensorManager;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.widget.TextView;import com.example.myapplication.R;import com.example.myapplication.baseactivity.BaseActivity;public class SensorActivity extends BaseActivity implements SensorEventListener{//2.必須實現介面 private TextView mTextviewOri; private TextView mTextviewlight; private TextView mTextviewcichang; private TextView mTextviewtemp; private TextView mTextviewpressure; private SensorManager mSensorManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sensor); mTextviewOri = (TextView) findViewById(R.id.textori); mTextviewlight = (TextView) findViewById(R.id.textlight); mTextviewcichang = (TextView) findViewById(R.id.textcichang); mTextviewtemp = (TextView) findViewById(R.id.texttemper); mTextviewpressure = (TextView) findViewById(R.id.textpressure); //1.獲得感應器管理服務 mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); } @Override protected void onResume() { super.onResume(); //3.為系統的方向感應器註冊監聽器 mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_GAME); //.為系統的磁場感應器註冊監聽器 mSensorManager.registerListener(this,mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),SensorManager.SENSOR_DELAY_GAME); //.為系統的溫度感應器註冊監聽器 mSensorManager.registerListener(this,mSensorManager.getDefaultSensor(Sensor.TYPE_AMBIENT_TEMPERATURE),SensorManager.SENSOR_DELAY_GAME); //.為系統的光感應器註冊監聽器 mSensorManager.registerListener(this,mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT),SensorManager.SENSOR_DELAY_GAME); //.為系統的壓力感應器註冊監聽器 mSensorManager.registerListener(this,mSensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE),SensorManager.SENSOR_DELAY_GAME); } /** * 下面兩個方法是實現介面不許實現的方法 * @param event */ @Override public void onSensorChanged(SensorEvent event) {//4.獲得資料進行操作 float[] values = event.values; int sensorType = event.sensor.getType();//擷取觸發event的感應器類型 StringBuilder sb = null; //判斷是哪個感應器發生改變 switch (sensorType){ //方向感應器 case Sensor.TYPE_ORIENTATION: sb = new StringBuilder(); sb.append(繞z軸轉過的角度:); sb.append(values[0]); sb.append(繞x軸轉過的角度:); sb.append(values[1]); sb.append(繞y軸轉過的角度:); sb.append(values[2]); mTextviewOri.setText(sb.toString()); break; //磁場感應器 case Sensor.TYPE_MAGNETIC_FIELD: sb = new StringBuilder(); sb.append(x方向上的角度:); sb.append(values[0]); sb.append(y方向上的角度:); sb.append(values[1]); sb.append(z方向上的角度:); sb.append(values[2]); mTextviewcichang.setText(sb.toString()); break; //溫度感應器 case Sensor.TYPE_AMBIENT_TEMPERATURE: sb = new StringBuilder(); sb.append(當前溫度:); sb.append(values[0]); mTextviewtemp.setText(sb.toString()); break; //光感應器 case Sensor.TYPE_LIGHT: sb = new StringBuilder(); sb.append(當前光強度:); sb.append(values[0]); mTextviewlight.setText(sb.toString()); break; //壓力感應器 case Sensor.TYPE_PRESSURE: sb = new StringBuilder(); sb.append(當前壓力:); sb.append(values[0]); mTextviewpressure.setText(sb.toString()); break; } } @Override //感應器精度改變時回調的方法 public void onAccuracyChanged(Sensor sensor, int accuracy) { } @Override protected void onPause() { //程式暫停時取消註冊感應器監聽器 mSensorManager.unregisterListener(this); super.onPause(); } @Override protected void onStop() { //程式停止時取消感應器監聽器 mSensorManager.unregisterListener(this); super.onStop(); }}
布局:
效果:
說明:
實際上,上面的資料類比時都是變化的,但手機其實是沒有動位置的,所以我還不知道是哪裡的問題呢,望知道的大神指教。^^
還有,可以看出,該程式不能擷取感應器和壓力感應器的值,這是因為My Phone並不支援溫度感應器和壓力感應器的讀取。