Android系統中傳感器相關的簡介
大多數主流的android手機都有內置的傳感器,可以用來測方向,位置,環境。通常精確度都很高,應用的領域也自然很廣泛。例如重力傳感器,很多的游戲 都需要靠它來操作,通過檢測重力系統的變化很精確的反映到游戲操作中;又如微信的“搖一搖”靠加速度傳感器來檢測在不同方向的加速度來實現的,還有很多不 是很常用的傳感器,通過查看API大概找到如下的一些android系統中的傳感器類型:
1.TYPE_ACCELEROMETER:加速度傳感器,單位是m/s2,測量應用于設備X、Y、Z軸上的加速度,又叫做G-sensor
2.TYPE_AMBIENT_TEMPERATURE:溫度傳感器,單位是℃,測量返回當前的溫度。
3.TYPE_GRAVITY:重力傳感器,單位是m/s2,測量應用于設備X、Y、Z軸上的重力,也叫GV-sensor,地球上的數值是9.8m/s2,也可以設置其他星球(呃,目測平時用不到吧)
4.TYPE_GYROSCOPE:陀螺儀傳感器,單位是rad/s,測量設備x、y、z三軸的角加速度數據。
5.TYPE_LIGHT:光線感應傳感器,單位lx,檢測周圍的光線強度,手機系統中主要是調節LCD亮度。
6.TYPE_LINEAR_ACCELERATION:線性加速度傳感器,單位是m/s2,該傳感器是獲取加速度傳感器去除重力的影響得到的數據。
7.TYPE_MAGNETIC_FIELD:磁力傳感器,單位是uT(微特斯拉),測量設備周圍三個物理軸(x,y,z)的磁場(個人不了解哪些App上有應用)。
8.TYPE_ORIENTATION:方向傳感器,測量設備圍繞三個物理軸(x,y,z)的旋轉角度,API顯示使用 SensorManager.getOrientation()替代掉了。
9.TYPE_PRESSURE:壓力傳感器,單位是hPa(百帕斯卡),返回當前環境下的壓強。
10.TYPE_PROXIMITY:距離傳感器,單位是cm,用來測量某個對象到屏幕的距離,可用于打電話時判斷人耳到電話屏幕距離來進行關閉屏幕的省電功能。
11.TYPE_RELATIVE_HUMIDITY:濕度傳感器,單位是%,來測量周圍環境的相對濕度(估計很少設備有吧)。
12.TYPE_ROTATION_VECTOR:旋轉矢量傳感器,旋轉矢量代表設備的方向,是一個將坐標軸和角度混合計算得到的數據(具體咋用不了解)。
13.TYPE_TEMPERATURE:溫度傳感器,新版本中被TYPE_AMBIENT_TEMPERATURE替換掉了。
目前應該還沒 有哪款設備擁有以上所有的傳感器吧?大多數設備會有加速度傳感器,重力傳感器,光線傳感器,距離傳感器等,不同的設備配備的硬件也不同,當然模擬器上是無 法使用傳感器的,即使能也只是模擬,我們可以通過下面的方法自己檢測一下手中的設備都包含哪些傳感器:
package com.example.sensorlistdemo; import java.util.List; import android.hardware.Sensor; import android.hardware.SensorManager; import android.os.Bundle; import android.app.Activity; import android.content.Context; import android.widget.TextView; public class MainA extends Activity { private TextView txt; @SuppressWarnings("deprecation") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); txt = (TextView) findViewById(R.id.txt); // 從系統服務中獲得傳感器管理器 SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); // 從傳感器管理器中獲得全部的傳感器列表 ListallSensors = sensorManager.getSensorList(Sensor.TYPE_ALL); // 顯示有多少個傳感器 txt.setText("經檢測該手機有" + allSensors.size() + "個傳感器,他們分別是:\n"); // 顯示每個傳感器的具體信息 for (Sensor s : allSensors) { String tempString = "\n" + " 設備名稱:" + s.getName() + "\n" + " 設備版本:" + s.getVersion() + "\n" + " 供應商:" + s.getVendor() + "\n"; switch (s.getType()) { case Sensor.TYPE_ACCELEROMETER: txt.setText(txt.getText().toString() + s.getType() + " 加速度傳感器accelerometer" + tempString); break; case Sensor.TYPE_AMBIENT_TEMPERATURE: txt.setText(txt.getText().toString() + s.getType() + " 溫度傳感器temperature" + tempString); break; case Sensor.TYPE_GRAVITY: txt.setText(txt.getText().toString() + s.getType() + " 重力傳感器gravity" + tempString); break; case Sensor.TYPE_GYROSCOPE: txt.setText(txt.getText().toString() + s.getType() + " 陀螺儀傳感器gyroscope" + tempString); break; case Sensor.TYPE_LIGHT: txt.setText(txt.getText().toString() + s.getType() + " 環境光線傳感器light" + tempString); break; case Sensor.TYPE_LINEAR_ACCELERATION: txt.setText(txt.getText().toString() + s.getType() + " 線性加速度傳感器linear_accelerometer" + tempString); break; case Sensor.TYPE_MAGNETIC_FIELD: txt.setText(txt.getText().toString() + s.getType() + " 電磁場傳感器magnetic field" + tempString); break; case Sensor.TYPE_ORIENTATION: txt.setText(txt.getText().toString() + s.getType() + " 方向傳感器orientation" + tempString); break; case Sensor.TYPE_PRESSURE: txt.setText(txt.getText().toString() + s.getType() + " 壓力傳感器pressure" + tempString); break; case Sensor.TYPE_PROXIMITY: txt.setText(txt.getText().toString() + s.getType() + " 距離傳感器proximity" + tempString); break; case Sensor.TYPE_RELATIVE_HUMIDITY: txt.setText(txt.getText().toString() + s.getType() + " 濕度傳感器relative_humidity" + tempString); break; case Sensor.TYPE_ROTATION_VECTOR: txt.setText(txt.getText().toString() + s.getType() + " 旋轉矢量傳感器rotation_vector" + tempString); break; case Sensor.TYPE_TEMPERATURE: txt.setText(txt.getText().toString() + s.getType() + " 溫度傳感器temperature" + tempString); break; default: txt.setText(txt.getText().toString() + s.getType() + " 未知傳感器" + tempString); break; } } } }
以上代碼在android4.0環境下編寫的,可以獲取到所有類型的傳感器TYPE,經測試,我的破測試機只有如下三個傳感器,比較悲劇的低端機: