現在每部Android 手機里面都會內置有許多的傳感器,它們能夠監測到各種發生在手機上的物理事件,而我們只要靈活運用這些事件就可以編寫出很多好玩的應用程序。今天我們開始簡單的傳感器使用的學習。
目錄導航:
傳感器的簡要說明
一、 手機傳感器的介紹:
- 手機中內置的傳感器是一種微型的物理設備,它能夠探測、感受到外界的信號,並按一定規律轉換成我們所需要的信息
- Android 手機通常都會支持多種類型的傳感器,如光照傳感右器、加速度傳感器、地磁傳感器、壓力傳感器、溫度傳感器
- Android 系統只是負責將這些傳感器所輸出的信息傳遞給我們,至於具體如何去利用這些信息就要我們在程序中具體去利用這些得到的數據做處理了
二、 手機基本支持的傳感器類型:
從Android1.5開始,系統內置了對多達八種傳感器的支持,他們分別是:加速度傳感器(accelerometer)、陀螺儀(gyroscope)、環境光照傳感器(light)、磁力傳感器(magnetic field)、方向傳感器(orientation)、壓力傳感器(pressure)、距離傳感器(proximity)和溫度傳感器(temperature)。
三、 傳感器的一些使用說明
- Android所有的傳感器都歸傳感器管理器 SensorManager 管理,獲取傳感器管理器的方法很簡單:
String service_name = Context.SENSOR_SERVICE;
SensorManager sensorManager = (SensorManager)getSystemService(service_name);
- 從傳感器管理器中獲取其中某個或者某些傳感器的方法有如下三種:
第一種:獲取某種傳感器的默認傳感器:
Sensor defaultGyroscope = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
第二種:獲取某種傳感器的列表:
List<Sensor> pressureSensors = sensorManager.getSensorList(Sensor.TYPE_PRESSURE);
第三種:獲取所有傳感器的列表:
List<Sensor> allSensors = sensorManager.getSensorList(Sensor.TYPE_ALL);
四、 對於一個傳感器,信息的獲取:
|
方法
|
描述
|
|
getMaximumRange()
|
最大取值范圍
|
|
getName()
|
設備名稱
|
|
getPower()
|
功率
|
|
getResolution()
|
精度
|
|
getType()
|
傳感器類型
|
|
getVentor()
|
設備供應商
|
|
getVersion()
|
設備版本號 |
五、 現階段Android支持的常用傳感器有8種:
|
傳感器類型常量
|
內部整數值
|
中文名稱
|
|
Sensor.TYPE_ACCELEROMETER
|
1 |
加速度傳感器
|
|
Sensor.TYPE_MAGNETIC_FIELD
|
2 |
磁力傳感器
|
|
Sensor.TYPE_ORIENTATION
|
3 |
方向傳感器
|
|
Sensor.TYPE_GYROSCOPE
|
4 |
陀螺儀傳感器
|
|
Sensor.TYPE_LIGHT
|
5 |
環境光照傳感器
|
|
Sensor.TYPE_PRESSURE
|
6 |
壓力傳感器
|
|
Sensor.TYPE_TEMPERATURE
|
7 |
溫度傳感器
|
|
Sensor.TYPE_PROXIMITY
|
8 | 距離傳感器 |
傳感器的實例
我們創建一個傳感器的應用實例,項目結構如下:
一、 在MainActivity中初始化一些信息:
private final static String TAG = "SensorTest"; private TextView textView; SensorManager sm = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.textView); sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE); }
二、 得到手機上支持的所有傳感器類型:創建一個方法
// 顯示手機支持的傳感器的清單 public void allSensors(View view) { //從系統服務中獲得傳感器管理器 //從傳感器管理器中獲得全部的傳感器列表 List<Sensor> allSensors = sm.getSensorList(Sensor.TYPE_ALL); Log.i(TAG, "allsensors: " + allSensors.size()); //顯示每個傳感器的具體信息 for (Sensor sensor : allSensors) { String name = sensor.getName(); String vendor = sensor.getVendor(); int version = sensor.getVersion(); Log.i(TAG, "name: " + name + ", vendor: " + vendor + ", version: " + version); } }
三、 光傳感器的簡單使用:
// 光照傳感器的使用 public void lightSensors(View view) { Sensor sensor = sm.getDefaultSensor(Sensor.TYPE_LIGHT); sm.registerListener(LightListener, sensor, SensorManager.SENSOR_DELAY_NORMAL); } // 光照傳感器的事件 private SensorEventListener LightListener = new SensorEventListener() { @Override public void onSensorChanged(SensorEvent event) { float value = event.values[0]; Sensor sensor = event.sensor; textView.setText(value + ""); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { Log.i(TAG, "on accuracy change: " + accuracy); } };
四、 加速度傳感器的簡單使用:
// 加速度傳感器 public void accelerSensors(View view) { Sensor sensor = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); sm.registerListener(AcclerListener, sensor, SensorManager.SENSOR_DELAY_NORMAL); } // 加速度傳感器的事件 private SensorEventListener AcclerListener = new SensorEventListener() { @Override public void onSensorChanged(SensorEvent event) { // 加速度可能會是負值,所以要取它們的絕對值 float xValue = Math.abs(event.values[0]); float yValue = Math.abs(event.values[1]); float zValue = Math.abs(event.values[2]); if (xValue > 15 || yValue > 15 || zValue > 15) { // 認為用戶搖動了手機,觸發搖一搖邏輯 Toast.makeText(MainActivity.this, "搖一搖", Toast.LENGTH_SHORT).show(); } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { Log.i(TAG, "on accuracy change: " + accuracy); } };
五、 在onDestory方法調用unregisterListener()方法來釋放使用的資源。
@Override protected void onDestroy() { super.onDestroy(); if (sm != null) { sm.unregisterListener(LightListener); sm.unregisterListener(AcclerListener); } }
六、 顯示結果:
- 所有傳感器的打印日志:
allsensors: 27 name: Accelerometer, vendor: STMicroelectronics, version: 1 name: Magnetometer, vendor: AKM, version: 1 name: Magnetometer Uncalibrated, vendor: AKM, version: 1 name: Gyroscope, vendor: STMicroelectronics, version: 1 name: Gyroscope Uncalibrated, vendor: STMicroelectronics, version: 1 name: Proximity Sensor, vendor: TAOS, version: 1 name: Ambient Light Sensor, vendor: TAOS, version: 1 name: Barometer Sensor, vendor: BOSCH, version: 1 name: Temperature Sensor, vendor: BOSCH, version: 1 name: Gravity, vendor: Qualcomm, version: 1 name: Linear Acceleration, vendor: Qualcomm, version: 1 name: Rotation Vector, vendor: Qualcomm, version: 1 name: Step Detector, vendor: Qualcomm, version: 1 name: Step Counter, vendor: Qualcomm, version: 1 name: Significant Motion Detector, vendor: Qualcomm, version: 1 name: Game Rotation Vector, vendor: Qualcomm, version: 1 name: Geomagnetic Rotation Vector, vendor: Qualcomm, version: 1 name: Orientation, vendor: Qualcomm, version: 1 name: AMD, vendor: Qualcomm, version: 1 name: RMD, vendor: Qualcomm, version: 1 name: Basic Gestures, vendor: Qualcomm, version: 1 name: Facing, vendor: Qualcomm, version: 1 name: Tilt, vendor: Qualcomm, version: 1 name: Pedometer, vendor: Qualcomm, version: 1 name: PEDESTRIAN-ACTIVITY-MONITOR, vendor: Qualcomm, version: 1 name: Motion Accel, vendor: Qualcomm, version: 1 name: Temperature Sensor, vendor: BOSCH, version: 1
友情鏈接
- 測試用例的源代碼下載 訪問密碼 5760
