Android Sensor(傳感器)


Android 常見傳感器

最終我們要實現這些:

源碼看這里:
項目源碼

在這之前,我們需要了解關於Android的坐標系:
對於大多數傳感器來說,坐標系統是相對於設備屏幕來說的。
當一個設備被放在其默認的方向上時,X軸是水平指向右的,Y軸是垂直向上的,Z軸是指向屏幕正面之外的,即屏幕背面是Z的負值。


首先,讓Activity實現SensorEventListener接口(實現接口需要復寫onSensorChangedonAccuracyChanged方法),便於監聽來刷新數據
然后創建SensorManager對象,然后為它注冊加速度傳感器監聽器

        //獲取系統服務
        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

        //      注冊事件
        //      * 參數1 :SensorEventListener監聽器
        //      * 參數2 :Sensor 一個服務可能有多個Sensor實現,此處調用getDefaultSensor獲取默認的Sensor
        //      * 參數3 :模式 可選數據變化的刷新頻率,多少微秒取一次。
        sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
        									SensorManager.SENSOR_DELAY_NORMAL);

加速度傳感器(Accelerometer)

TYPE_ACCELEROMETER

onSensorChanged()方法中寫入判斷語句,以下判斷語句均寫在這個方法內。

    public void onSensorChanged(SensorEvent event) {
            //加速度傳感器
            if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
                float x = event.values[0];
                float y = event.values[1];
                float z = event.values[2];
                tvaccelerometer_x.setText("X軸加速度:" + x);
                tvaccelerometer_y.setText("Y軸加速度:" + y);
                tvaccelerometer_z.setText("Z軸加速度:" + z);
            }
	}

距離傳感器(Proximity)

TYPE_PROXIMITY 
 		//距離傳感器
        if (event.sensor.getType() == Sensor.TYPE_PROXIMITY) {
            float x = event.values[0];
            tvproximity.setText("距離為:" + x);
        }

方向傳感器(Orientation)

TYPE_ORIENTATION
        //方向傳感器
        if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {
            float x = event.values[0];
            float y = event.values[1];
            float z = event.values[2];
            orientation_x.setText("X軸轉過的角度:" + x);
            orientation_y.setText("Y軸轉過的角度:" + y);
            orientation_z.setText("Z軸轉過的角度:" + z);
        }

X:方位角,手機繞着Z軸旋轉的角度。0表示正北(North),90表示正東(East),
180表示正南(South),270表示正西(West)。假如values[0]的值剛好是這四個值的話,
並且手機沿水平放置的話,那么當前手機的正前方就是這四個方向,可以利用這一點來
寫一個指南針。

Y:傾斜角,手機翹起來的程度,當手機繞着x軸傾斜時該值會發生變化。取值
范圍是[-180,180]之間。假如把手機放在桌面上,而桌面是完全水平的話,values1的則應該
是0,當然很少桌子是絕對水平的。從手機頂部開始抬起,直到手機沿着x軸旋轉180(此時屏幕
鄉下水平放在桌面上)。在這個旋轉過程中,values[1]的值會從0到-180之間變化,即手機抬起
時,values1的值會逐漸變小,知道等於-180;而加入從手機底部開始抬起,直到手機沿着x軸
旋轉180度,此時values[1]的值會從0到180之間變化。我們可以利用value[1]的這個特性結合
value[2]來實現一個平地尺。

Z:滾動角,沿着Y軸的滾動角度,取值范圍為:[-90,90],假設將手機屏幕朝上水平放在
桌面上,這時如果桌面是平的,values2的值應為0。將手機從左側逐漸抬起,values[2]的值將
逐漸減小,知道垂直於手機放置,此時values[2]的值為-90,從右側則是0-90;加入在垂直位置
時繼續向右或者向左滾動,values[2]的值將會繼續在-90到90之間變化。

陀螺儀傳感器(Gyroscope)

TYPE_GYROSCOPE
        //陀螺儀傳感器
        if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE) {
            float x = event.values[0];
            float y = event.values[1];
            float z = event.values[2];
            //將弧度傳化成角度
            x = (float) Math.toDegrees(x);
            y = (float) Math.toDegrees(y);
            z = (float) Math.toDegrees(z);
            gyroscope_x.setText("X軸角速度:" + x);
            gyroscope_y.setText("Y軸角速度:" + y);
            gyroscope_z.setText("Z軸角速度:" + z);
        }

原本數據為弧度制,這里轉換為角度制,
陀螺儀的XYZ分別代表設備圍繞XYZ三個軸旋轉的角速度。

線性加速度傳感器(LinearAcceleration)

TYPE_LINEAR_ACCELERATION
        //線性加速度傳感器
        if (event.sensor.getType() == Sensor.TYPE_LINEAR_ACCELERATION) {
            float x = event.values[0];
            float y = event.values[1];
            float z = event.values[2];
            linearacceleration_x.setText("X軸加速度:" + x);
            linearacceleration_y.setText("Y軸加速度:" + y);
            linearacceleration_z.setText("Z軸加速度:" + z);
        }

就是去掉重力加速度后各個方向的加速度

光傳感器(Light)

TYPE_LIGHT
        //光傳感器
        if (event.sensor.getType() == Sensor.TYPE_LIGHT) {
            float x = event.values[0];
            light.setText("光強為:" + x);
        }

感知當前的光強度

壓強傳感器

TYPE_PRESSURE
        //壓強傳感器
        if (event.sensor.getType() == Sensor.TYPE_PRESSURE) {
            float x = event.values[0];
            pressure.setText("壓強為:" + x + "hPa");
        }

壓力傳感器返回當前的壓強,單位是百帕斯卡hectopascal(hPa)。

計步傳感器

TYPE_STEP_COUNTER————計步器(記錄歷史步數累加值)  
TYPE_STEP_DETECTOR————檢測器(檢測每次步伐數據)
        //計步傳感器
        if (event.sensor.getType() == Sensor.TYPE_STEP_COUNTER) {
            float x = event.values[0];
            step_counter.setText("總步數為:" + x);
        }
        if (event.sensor.getType() == Sensor.TYPE_STEP_DETECTOR) {
            float x = event.values[0];
            step_detector.setText("步數是否有效:" + x);
        }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM