標籤:android sensormanager sensor 感應器開發
本文中,筆者給大家分享一下Android中如何進行Android裝置感應器開發。
轉載請註明作者xiong_it和連結:http://blog.csdn.net/xiong_it/article/details/45917009
Android感應器開發基本流程
public class SensorActivity extends Activity implements SensorEventListener { private SensorManager mSensorManager; private Sensor mSensor; @Override public final void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //第一步:通過getSystemService獲得SensorManager執行個體對象 mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); //第二步:通過SensorManager執行個體對象獲得想要的感應器對象:參數決定擷取哪個感應器 mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); } //第四步:必須重寫的兩個方法:onAccuracyChanged,onSensorChanged /** * 感應器精度發生改變的回調介面 */ @Override public final void onAccuracyChanged(Sensor sensor, int accuracy) { //TODO 在感應器精度發生改變時做些操作,accuracy為當前感應器精度 } /** * 感應器事件值改變時的回調介面:執行此方法的頻率與註冊感應器時的頻率有關 */ @Override public final void onSensorChanged(SensorEvent event) { // 大部分感應器會返回三個軸方向x,y,x的event值,值的意義因感應器而異 float x = event.values[0]; float y = event.values[1]; float z = event.values[2]; //TODO 利用獲得的三個float感應器值做些操作 } /** * 第三步:在獲得焦點時註冊感應器並讓本類實現SensorEventListener介面 */ @Override protected void onResume() { super.onResume(); /* *第一個參數:SensorEventListener介面的執行個體對象 *第二個參數:需要註冊的感應器執行個體 *第三個參數:感應器擷取感應器事件event值頻率: * SensorManager.SENSOR_DELAY_FASTEST = 0:對應0微秒的更新間隔,最快,1微秒 = 1 % 1000000秒 * SensorManager.SENSOR_DELAY_GAME = 1:對應20000微秒的更新間隔,遊戲中常用 * SensorManager.SENSOR_DELAY_UI = 2:對應60000微秒的更新間隔 * SensorManager.SENSOR_DELAY_NORMAL = 3:對應200000微秒的更新間隔 * 鍵入自訂的int值x時:對應x微秒的更新間隔 * */ mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL); } /** * 第五步:在失去焦點時登出感應器 */ @Override protected void onPause() { super.onPause(); mSensorManager.unregisterListener(this); }}
總結起來大致有5步:
第一步:擷取SensorManager對象
第二步:擷取Sensor對象
第三步:註冊Sensor對象
第四步:重寫onAccuracyChanged,onSensorChanged這兩個方法
第五步:登出Sensor對象Android裝置中感應器的基本類型
利用SensorManager擷取感應器:
mSensor = mSensorManager.getDefaultSensor(int TYPE);//TYPE為Sensor中定義的static final 值
請參考下面Sensor.java中定義的部分TYPE值:
/** * 擷取加速度感應器的常量 */ public static final int TYPE_ACCELEROMETER = 1; /** * 擷取磁場感應器的常量 */ public static final int TYPE_FIELD = 2; /** * 擷取方向感應器的常量,已淘汰 */ @Deprecated public static final int TYPE_ORIENTATION = 3; /** * 擷取陀螺儀感應器的常量 */ public static final int TYPE_GYROSCOPE = 4; /** * 擷取光線感應器的常量 */ public static final int TYPE_LIGHT = 5; /** * 擷取壓力感應器的常量 */ public static final int TYPE_PRESSURE = 6; @Deprecated public static final int TYPE_TEMPERATURE = 7;//擷取溫度感應器,已淘汰 /** * 擷取距離感應器的常量 */ public static final int TYPE_PROXIMITY = 8; /** * 擷取重力感應器的常量 */ public static final int TYPE_GRAVITY = 9; /** * 擷取線性加速度感應器的常量 */ public static final int TYPE_LINEAR_ACCELERATION = 10; /** * 擷取旋轉向量感應器的常量 */ public static final int TYPE_ROTATION_VECTOR = 11; /** * 擷取相對濕度感應器的常量 */ public static final int TYPE_RELATIVE_HUMIDITY = 12; /** * 擷取溫度感應器的常量:取締了public static final int TYPE_TEMPERATURE = 7; */ public static final int TYPE_AMBIENT_TEMPERATURE = 13;
Android裝置中感應器event值解釋
加速度感應器加速度感應器又叫G-sensor,返回x、y、z三軸的加速度數值。
該數值包含地心引力的影響,單位是m/s^2。
將手機平放在案頭上,x軸預設為0,y軸預設0,z軸預設9.81。
將手機朝下放在案頭上,z軸為-9.81。
將手機向左傾斜,x軸為正值。
將手機向右傾斜,x軸為負值。
將手機向上傾斜,y軸為負值。
將手機向下傾斜,y軸為正值。
磁力感應器磁力感應器簡稱為M-sensor,返回x、y、z三軸的環境磁場資料。
該數值的單位是微特斯拉(micro-Tesla),用uT表示。
單位也可以是高斯(Gauss),1Tesla=10000Gauss。
硬體上一般沒有獨立的磁力感應器,磁力資料由電子羅盤感應器提供(E-compass)。
電子羅盤感應器同時提供下文的方向感應器資料。
方向感應器方向感應器簡稱為O-sensor,返回三軸的角度資料,方向資料的單位是角度。
為了得到精確的角度資料,E-compass需要擷取G-sensor的資料,
經過計算生產O-sensor資料,否則只能擷取水平方向的角度。
方向感應器提供三個資料,分別為azimuth、pitch和roll。
azimuth:方位,返回水平時磁北極和Y軸的夾角,範圍為0°至360°。
0°=北,90°=東,180°=南,270°=西。
pitch:x軸和水平面的夾角,範圍為-180°至180°。
當z軸向y軸轉動時,角度為正值。
roll:y軸和水平面的夾角,由於曆史原因,範圍為-90°至90°。
當x軸向z軸移動時,角度為正值。
電子羅盤在擷取正確的資料前需要進行校準,通常可用8字校準法。
8字校準法要求使用者使用需要校準的裝置在空中做8字晃動,
原則上盡量多的讓裝置法線方向指向空間的所有8個象限。
陀螺儀感應器陀螺儀感應器叫做Gyro-sensor,返回x、y、z三軸的角速度資料。
角速度的單位是radians/second。
根據Nexus S手機實測:
水平逆時針旋轉,Z軸為正。
水平逆時針旋轉,z軸為負。
向左旋轉,y軸為負。
向右旋轉,y軸為正。
向上旋轉,x軸為負。
向下旋轉,x軸為正。
光線感應感應器光線感應感應器檢測即時的光線強度,光強單位是lux,其物理意義是照射到單位面積上的光通量。
光線感應感應器主要用於Android系統的LCD自動亮度功能。
可以根據採樣到的光強數值即時調整LCD的亮度。
壓力感應器壓力感應器返回當前的壓強,單位是百帕斯卡hectopascal(hPa)。
溫度感應器溫度感應器返回當前的溫度。
距離感應器又稱接近感應器,檢測物體與手機的距離,單位是厘米。
一些接近感應器只能返回遠和近兩個狀態,
因此,接近感應器將最大距離返回遠狀態,小於最大距離返回近狀態。
接近感應器可用於電話中時自動關閉LCD螢幕以節省電量。
一些晶片整合了接近感應器和光線感應器兩者功能。
重力感應器重力感應器簡稱GV-sensor,輸出重力資料。
在地球上,重力數值為9.8,單位是m/s^2。
座標系統與加速度感應器相同。
當裝置複位時,重力感應器的輸出與加速度感應器相同。
線性加速度感應器線性加速度感應器簡稱LA-sensor。
線性加速度感應器是加速度感應器減去重力影響擷取的資料。
單位是m/s^2,座標系統與加速度感應器相同。
加速度感應器、重力感應器和線性加速度感應器的計算公式如下:
加速度 = 重力 + 線性加速度
旋轉向量感應器旋轉向量感應器簡稱RV-sensor。
旋轉向量代表裝置的方向,是一個將座標軸和角度混合計算得到的資料。
RV-sensor輸出三個資料:
x*sin(theta/2)
y*sin(theta/2)
z*sin(theta/2)
sin(theta/2)是RV的數量級。
RV的方向與軸旋轉的方向相同。
RV的三個數值,與cos(theta/2)組成一個四元組。
RV的資料沒有單位,使用的座標系與加速度相同。
舉例:
sensors_event_t.data[0] = x*sin(theta/2)
sensors_event_t.data[1] = y*sin(theta/2)
sensors_event_t.data[2] = z*sin(theta/2)
sensors_event_t.data[3] = cos(theta/2)
參考連結:http://my.oschina.net/jerikc/blog/167499
轉載請註明作者xiong_it和連結:http://blog.csdn.net/xiong_it/article/details/45917009
Android開發:Android裝置感應器開發總結