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

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

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

1 傳感器簡介

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

Android 平臺支持三大類傳感器:

類別傳感器說明
運(yùn)動傳感器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è)備中的物理組件。這類傳感器通過直接測量特定的環(huán)境屬性(如加速度、地磁場強(qiáng)度或角度變化)來采集數(shù)據(jù)?;谲浖膫鞲衅鞑皇俏锢碓O(shè)備,它們只是模仿基于硬件的傳感器?;谲浖膫鞲衅鲝囊粋€或多個基于硬件的傳感器獲取數(shù)據(jù),有時被稱為虛擬傳感器或合成傳感器。比如線性加速度傳感器和重力傳感器就是基于軟件的傳感器。

傳感器棄用說明:

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

2 傳感器的使用

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

Android 中內(nèi)置了很多系統(tǒng)級的服務(wù),用于給開發(fā)人員使用,而傳感器也是通過傳感器服務(wù) SensorManager 來管理的。而在 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)聽的傳感器

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

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

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

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

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

運(yùn)行時檢測。

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

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

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

對于某一個傳感器,它的一些具體信息的獲取方法如下:

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

2.3 注冊傳感器的監(jiān)聽器

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

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

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

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

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

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

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

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

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

2.4 注銷傳感器的監(jiān)聽器

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

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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Android上使用grpc的方法教程

    Android上使用grpc的方法教程

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

    完美解決Android App啟動頁有白屏閃過的問題

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

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

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

    Android使用MMKV的記錄

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

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

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

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

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

    Android 三種動畫詳解及簡單實(shí)例

    這篇文章主要介紹了Android 三種動畫詳解及簡單實(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í)價值,感興趣的小伙伴可以了解一下
    2023-06-06
  • Android Studio連接MySql實(shí)現(xiàn)登錄注冊(附源代碼)

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

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

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

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

最新評論