欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android?如何獲取傳感器的數(shù)據(jù)方法詳解

 更新時(shí)間:2022年07月29日 10:40:04   作者:??ByteSaid???  
這篇文章主要介紹了Android?如何獲取傳感器的數(shù)據(jù),傳感器?Sensor?是一種檢測(cè)裝置,能感受到被測(cè)量的信息,并能將感受到的信息,按一定規(guī)律變換成為電信號(hào)或其他所需形式的信息輸出,以滿(mǎn)足信息的傳輸、處理、存儲(chǔ)、顯示、記錄和控制等要求

1 傳感器簡(jiǎn)介

傳感器 Sensor 是一種檢測(cè)裝置,能感受到被測(cè)量的信息,并能將感受到的信息,按一定規(guī)律變換成為電信號(hào)或其他所需形式的信息輸出,以滿(mǎn)足信息的傳輸、處理、存儲(chǔ)、顯示、記錄和控制等要求。 Android 提供了對(duì)設(shè)備傳感器的支持,只要 Android 設(shè)備的硬件提供了這些傳感器,Android 應(yīng)用可以通過(guò)傳感器來(lái)獲取設(shè)備的外界條件,包括手機(jī)的運(yùn)行狀態(tài)、當(dāng)前擺放的方向等。Android 系統(tǒng)還提供了驅(qū)動(dòng)程序去管理這些傳感器硬件,可以通過(guò)監(jiān)聽(tīng)器的方式監(jiān)聽(tīng)傳感器硬件感知到的外部環(huán)境的變化。

Android 平臺(tái)支持三大類(lèi)傳感器:

類(lèi)別傳感器說(shuō)明
運(yùn)動(dòng)傳感器TYPE_ACCELEROMETER加速度傳感器,基于硬件
TYPE_GRAVITY重力傳感器,基于硬件或軟件
TYPE_GYROSCOPE陀螺儀傳感器,基于硬件
TYPE_ROTATION_VECTOR旋轉(zhuǎn)矢量傳感器,基于硬件或軟件
TYPE_LINEAR_ACCELERATION線性加速度傳感器,基于硬件或軟件
位置傳感器TYPE_MAGNETIC_FIELD磁力傳感器,基于硬件
TYPE_ORIENTATION方向傳感器,基于軟件
TYPE_PROXIMITY距離傳感器,基于硬件
環(huán)境傳感器TYPE_LIGHT光線感應(yīng)傳感器,基于硬件
TYPE_PRESSURE壓力傳感器,基于硬件
TYPE_TEMPERATURE溫度傳感器,基于硬件

有些傳感器基于硬件,有些基于軟件?;谟布膫鞲衅魇莾?nèi)置在手機(jī)或平板設(shè)備中的物理組件。這類(lèi)傳感器通過(guò)直接測(cè)量特定的環(huán)境屬性(如加速度、地磁場(chǎng)強(qiáng)度或角度變化)來(lái)采集數(shù)據(jù)?;谲浖膫鞲衅鞑皇俏锢碓O(shè)備,它們只是模仿基于硬件的傳感器?;谲浖膫鞲衅鲝囊粋€(gè)或多個(gè)基于硬件的傳感器獲取數(shù)據(jù),有時(shí)被稱(chēng)為虛擬傳感器或合成傳感器。比如線性加速度傳感器和重力傳感器就是基于軟件的傳感器。

傳感器棄用說(shuō)明:

  • Android 2.2(API 級(jí)別 8)已棄用方向傳感器,Android 4.4W(API 級(jí)別 20)已棄用此傳感器類(lèi)型 TYPE_ORIENTATION。替代方法見(jiàn)后面示例代碼。
  • 溫度傳感器已在 Android 4.0(API 級(jí)別 14)中棄用,不同設(shè)備具有不同的實(shí)現(xiàn)。

2 傳感器的使用

2.1 獲取傳感器服務(wù)

Android 中內(nèi)置了很多系統(tǒng)級(jí)的服務(wù),用于給開(kāi)發(fā)人員使用,而傳感器也是通過(guò)傳感器服務(wù) SensorManager 來(lái)管理的。而在 Android 組件中獲取系統(tǒng)服務(wù),使用方法 Context.getSystemService(String) 即可,它的參數(shù)均以 static final 的方式定義在 Context 中,而獲取 SensorManager 需要傳入 Context.SENSOR_SERVICE。

SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

2.2 獲取待監(jiān)聽(tīng)的傳感器

傳感器服務(wù)管理設(shè)備上所有的傳感器,所以需要獲取待監(jiān)聽(tīng)的傳感器。 可以通過(guò)在 getSensorList() 方法中傳入 TYPE_ALL 來(lái)獲取設(shè)備上的所有傳感器:

List<Sensor> deviceSensors = sensorManager.getSensorList(Sensor.TYPE_ALL);

也可以通過(guò)指定的 type 參數(shù)獲取到相對(duì)應(yīng)的傳感器,如果設(shè)備上有多個(gè)特定類(lèi)型的傳感器,則必須將其中一個(gè)指定為默認(rèn)傳感器。如果沒(méi)有指定默認(rèn)傳感器,則該方法調(diào)用會(huì)返回 null,這表示設(shè)備沒(méi)有該類(lèi)型的傳感器。

Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

注意使用前先判斷傳感器是否存在。

運(yùn)行時(shí)檢測(cè)。

if (sensor != null) {
    //傳感器存在
} else {
    //傳感器不存在
}

使用清單文件來(lái)限定目標(biāo)設(shè)備必須帶有指定傳感器配置。

<uses-feature
    android:name="android.hardware.sensor.accelerometer"
    android:required="true" />

對(duì)于某一個(gè)傳感器,它的一些具體信息的獲取方法如下:

  • getMaximumRange() 最大取值范圍
  • getName() 設(shè)備名稱(chēng)
  • getPower() 功率
  • getResolution() 精度
  • getType() 傳感器類(lèi)型
  • getVentor() 設(shè)備供應(yīng)商
  • getVersion() 設(shè)備版本號(hào)

2.3 注冊(cè)傳感器的監(jiān)聽(tīng)器

獲得 SensorManager 和 Sensor 對(duì)象之后,就可以為其 Sensor 注冊(cè)監(jiān)聽(tīng)器了。為傳感器注冊(cè)監(jiān)聽(tīng)器,使用 SensorManager.registerListener() 方法即可,它存在多個(gè)重載方法,但是有些方法已經(jīng)過(guò)時(shí)了,下面提供一個(gè)常用的方法:

boolean registerListener(SensorEventListener listener,Sensor sensor,int rateUs)

上面方法參數(shù)的意義:listener:傳感器的監(jiān)聽(tīng)器、sensor:待監(jiān)聽(tīng)的傳感器、rateUs:傳感器的采樣率。 從 registerListener() 方法可以看出,它需要傳遞一個(gè) SensorEventListener 對(duì)象,它就是傳感器的監(jiān)聽(tīng)器,其中包含兩個(gè)方法,需要開(kāi)發(fā)人員去實(shí)現(xiàn)它:

  • void onSensorChanged(SensorEvent event):當(dāng)傳感器感應(yīng)的值發(fā)生變化時(shí)回調(diào)。
  • void onAccuracyChanged(Sensor sensor,int accuracy):當(dāng)傳感器精度發(fā)生變化時(shí)回調(diào)。 對(duì)于上面兩個(gè)方法,傳感器的精度一般是不會(huì)發(fā)生改變的,所以我們一般主要的代碼量在 onSensorChanged()中。

在 onSensorChanged(SensorEvent event) 方法中有一個(gè)參數(shù) event,通過(guò) event 可以獲取傳感器的類(lèi)型以及傳感器的數(shù)據(jù)。

  • 獲取傳感器的類(lèi)型:event.sensor.getType()
  • 獲取傳感器的數(shù)據(jù):event.values[i],i為0,1,2...,不同傳感器,event.values[i] 對(duì)應(yīng)的數(shù)據(jù)不同。以加速度傳感器為例,values[0] 表示x軸上的加速度,values[1] 表示y軸上的加速度,values[2] 表示z軸上的加速度。

registerListener() 方法還有一個(gè) rateUs 的參數(shù),它表示監(jiān)聽(tīng)傳感器改變的采樣率,就是從傳感器獲取值的頻率。它被定義以 static final 的形式定義在 SensorManager 中,方便我們直接使用,它定義了如下幾個(gè)參數(shù):

參數(shù)延時(shí)說(shuō)明
SensorManager.SENSOR_DELAY_FASTEST0ms一般不是特別敏感的處理不推薦使用,該種模式可能造成手機(jī)電力大量消耗,由于傳遞的為原始數(shù)據(jù),算法不處理好將會(huì)影響游戲邏輯和 UI 的性能。
SensorManager.SENSOR_DELAY_GAME20ms一般絕大多數(shù)的實(shí)時(shí)性較高的游戲都使用該級(jí)別。
SensorManager.SENSOR_DELAY_UI60ms適合普通用戶(hù)界面 UI 變化的頻率,相對(duì)節(jié)省電能和邏輯處理,一般游戲開(kāi)發(fā)中不使用。
SensorManager.SENSOR_DELAY_NORMAL200ms對(duì)于一般的益智類(lèi)或 EASY 級(jí)別的游戲可以使用,但過(guò)低的采樣率可能對(duì)一些賽車(chē)類(lèi)游戲有跳幀現(xiàn)象。

Android 為我們提供了這幾個(gè)采樣率的參數(shù),方便我們使用。但對(duì)于選擇那種采樣率而言,并不是越快越好,要參照實(shí)際開(kāi)發(fā)的應(yīng)用的情況來(lái)說(shuō),采樣率越大,將越耗費(fèi)資源,包括電量、CPU 等,所以要根據(jù)實(shí)際情況選擇,畢竟再?gòu)?qiáng)大的應(yīng)用,如果造成設(shè)備續(xù)航能力的降低,也是會(huì)被用戶(hù)所不喜的。

2.4 注銷(xiāo)傳感器的監(jiān)聽(tīng)器

當(dāng)使用完傳感器之后,需要為其注銷(xiāo)監(jiān)聽(tīng)器,因?yàn)閭鞲衅鞯谋O(jiān)聽(tīng)器并不會(huì)因?yàn)閼?yīng)用的結(jié)束而自行釋放資源,需要開(kāi)發(fā)人員在適當(dāng)?shù)臅r(shí)候主動(dòng)注銷(xiāo)。注銷(xiāo)傳感器監(jiān)聽(tīng)器使用 SensorManager.unregisterListener() 方法即可,和監(jiān)聽(tīng)器的注冊(cè)方法一樣,它也具有多個(gè)重載的方法,但是有一些已經(jīng)被棄用了,下面介紹一個(gè)常用的:

void unregisterListener(SensorEventListener listener)

3 示例代碼

Java 代碼如下:

public class MainActivity extends AppCompatActivity {
    private final String TAG = "sensor-sample";
    private TextView mAccelerometerSensorTextView;
    private TextView mMagneticSensorTextView;
    private TextView mGyroscopeSensorTextView;
    private TextView mOrientationSensorTextView;
    private SensorManager mSensorManager;
    private MySensorEventListener mMySensorEventListener;
    private float[] mAccelerometerReading = new float[3];
    private float[] mMagneticFieldReading = new float[3];
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mAccelerometerSensorTextView = findViewById(R.id.accelerometer_sensor);
        mMagneticSensorTextView = findViewById(R.id.magnetic_sensor);
        mGyroscopeSensorTextView = findViewById(R.id.gyroscope_sensor);
        mOrientationSensorTextView = findViewById(R.id.orientation_sensor);

        this.mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        this.mMySensorEventListener = new MySensorEventListener();
    }
    @Override
    protected void onResume() {
        super.onResume();
        if (mSensorManager == null) {
            return;
        }
        Sensor accelerometerSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        if (accelerometerSensor != null) {
            //register accelerometer sensor listener
            mSensorManager.registerListener(mMySensorEventListener, accelerometerSensor, SensorManager.SENSOR_DELAY_UI);
        } else {
            Log.d(TAG, "Accelerometer sensors are not supported on current devices.");
        }
        Sensor magneticSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
        if (magneticSensor != null) {
            //register magnetic sensor listener
            mSensorManager.registerListener(mMySensorEventListener, magneticSensor, SensorManager.SENSOR_DELAY_UI);
        } else {
            Log.d(TAG, "Magnetic sensors are not supported on current devices.");
        }
        Sensor gyroscopeSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
        if (gyroscopeSensor != null) {
            //register gyroscope sensor listener
            mSensorManager.registerListener(mMySensorEventListener, gyroscopeSensor, SensorManager.SENSOR_DELAY_UI);
        } else {
            Log.d(TAG, "Gyroscope sensors are not supported on current devices.");
        }
    }
    @Override
    protected void onPause() {
        super.onPause();
        if (mSensorManager == null) {
            return;
        }
        //unregister all listener
        mSensorManager.unregisterListener(mMySensorEventListener);
    }

    /*
    This orientation sensor was deprecated in Android 2.2 (API level 8), and this sensor type was deprecated in Android 4.4W (API level 20).
    The sensor framework provides alternate methods for acquiring device orientation.
     */
    private void calculateOrientation() {
        final float[] rotationMatrix = new float[9];
        SensorManager.getRotationMatrix(rotationMatrix, null, mAccelerometerReading, mMagneticFieldReading);

        final float[] orientationAngles = new float[3];
        SensorManager.getOrientation(rotationMatrix, orientationAngles);
        Log.d(TAG, "orientation data[x:" + orientationAngles[0] + ", y:" + orientationAngles[1] + ", z:" + orientationAngles[2] + "]");
        mOrientationSensorTextView.setText("[x:" + orientationAngles[0] + ", y:" + orientationAngles[1] + ", z:" + orientationAngles[2] + "]");
    }
    private class MySensorEventListener implements SensorEventListener {
        @Override
        public void onSensorChanged(SensorEvent event) {
            if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
                mAccelerometerReading = event.values;
                Log.d(TAG, "accelerometer data[x:" + event.values[0] + ", y:" + event.values[1] + ", z:" + event.values[2] + "]");
                mAccelerometerSensorTextView.setText("[x:" + event.values[0] + ", y:" + event.values[1] + ", z:" + event.values[2] + "]");
            } else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
                mMagneticFieldReading = event.values;
                Log.d(TAG, "magnetic data[x:" + event.values[0] + ", y:" + event.values[1] + ", z:" + event.values[2] + "]");
                mMagneticSensorTextView.setText("[x:" + event.values[0] + ", y:" + event.values[1] + ", z:" + event.values[2] + "]");
            } else if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE) {
                Log.d(TAG, "gyroscope data[x:" + event.values[0] + ", y:" + event.values[1] + ", z:" + event.values[2] + "]");
                mGyroscopeSensorTextView.setText("[x:" + event.values[0] + ", y:" + event.values[1] + ", z:" + event.values[2] + "]");
            }
            calculateOrientation();
        }
        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
            Log.d(TAG, "onAccuracyChanged:" + sensor.getType() + "->" + accuracy);
        }

    }
}

運(yùn)行效果如下:

到此這篇關(guān)于Android 如何獲取傳感器的數(shù)據(jù)的文章就介紹到這了,更多相關(guān)Android 獲取傳感器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Android上使用grpc的方法教程

    Android上使用grpc的方法教程

    這篇文章主要給大家介紹了在Android上使用grpc的方法教程,文中通過(guò)示例代碼給大家詳細(xì)介紹了在android上使用grpc的方法以及可能遇到的種種問(wèn)題的解決方法,對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-07-07
  • 完美解決Android App啟動(dòng)頁(yè)有白屏閃過(guò)的問(wèn)題

    完美解決Android App啟動(dòng)頁(yè)有白屏閃過(guò)的問(wèn)題

    這篇文章主要介紹了完美解決Android App啟動(dòng)頁(yè)有白屏閃過(guò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • Android編程實(shí)現(xiàn)對(duì)話框形式進(jìn)度條功能示例

    Android編程實(shí)現(xiàn)對(duì)話框形式進(jìn)度條功能示例

    這篇文章主要介紹了Android編程實(shí)現(xiàn)對(duì)話框形式進(jìn)度條功能,結(jié)合具體實(shí)例形式分析了Android對(duì)話框形式進(jìn)度條的功能與布局相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-09-09
  • Android使用MMKV的記錄

    Android使用MMKV的記錄

    聽(tīng)說(shuō)騰訊的mmkv很牛皮,可以替代SharedPreferences,主要用來(lái)保存設(shè)置,比如串口號(hào)、波特率、攝像頭預(yù)覽角度等等,本文重點(diǎn)給大家介紹Android使用MMKV的記錄分享,感興趣的朋友一起看看吧
    2021-10-10
  • Android高仿微信聊天界面代碼分享

    Android高仿微信聊天界面代碼分享

    微信聊天現(xiàn)在非?;穑且蚱浣缑嫫羻?,哈哈,也許吧。微信每條消息都帶有一個(gè)氣泡,非常迷人,看起來(lái)感覺(jué)實(shí)現(xiàn)起來(lái)非常難,其實(shí)并不難。下面小編給大家分享實(shí)現(xiàn)代碼
    2016-02-02
  • 仿網(wǎng)易新聞客戶(hù)端頭條ViewPager嵌套實(shí)例

    仿網(wǎng)易新聞客戶(hù)端頭條ViewPager嵌套實(shí)例

    正確使用requestDisallowInterceptTouchEvent(boolean flag)方法,下面為大家介紹下外層ViewPager布局的實(shí)例,感興趣的朋友可以參考下哈
    2013-06-06
  • Android 三種動(dòng)畫(huà)詳解及簡(jiǎn)單實(shí)例

    Android 三種動(dòng)畫(huà)詳解及簡(jiǎn)單實(shí)例

    這篇文章主要介紹了Android 三種動(dòng)畫(huà)詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Android實(shí)現(xiàn)自定義View控件的流程詳解

    Android實(shí)現(xiàn)自定義View控件的流程詳解

    這篇文章主要為大家詳細(xì)介紹了Android中實(shí)現(xiàn)自定義View控件的流程,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下
    2023-06-06
  • Android Studio連接MySql實(shí)現(xiàn)登錄注冊(cè)(附源代碼)

    Android Studio連接MySql實(shí)現(xiàn)登錄注冊(cè)(附源代碼)

    登錄注冊(cè)是常用的一個(gè)功能,正好今天用android studio 做一個(gè)類(lèi)似于這樣的登錄軟件,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Android可自定義神奇動(dòng)效的卡片切換視圖實(shí)例

    Android可自定義神奇動(dòng)效的卡片切換視圖實(shí)例

    今天小編就為大家分享一篇關(guān)于Android可自定義神奇動(dòng)效的卡片切換視圖實(shí)例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-02-02

最新評(píng)論