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

詳解Android 傳感器開發(fā) 完全解析

 更新時間:2016年12月15日 15:22:28   作者:郭朝  
對于傳感器的使用,不同版本的Android手機也許存在較大的硬件差異,本篇文章主要介紹了Android 傳感器開發(fā),有興趣的可以了解一下。

大家好,由于最近會有對智能硬件相關(guān)的開發(fā)需求,所以最近這些天分享的博文也就大致掛鉤智能硬件了,像上一篇的藍牙分享,相信很多讀者已經(jīng)看過了,那么今天我為大家?guī)鞟ndroid傳感器方面知識的介紹與使用方法,對于傳感器的使用,不同版本的Android手機也許存在較大的硬件差異,但是萬變不離其宗,本篇將通過幾個最常見的傳感器,滲透式的教會大家如何使用這些傳感器,帶領(lǐng)大家完成這部分的進階提高。讓每一位Android開發(fā)者都對傳感器的使用變得游刃有余。

1.Android的三大類傳感器

Android傳感器按大方向劃分大致有這么三類傳感器:動作(Motion)傳感器、環(huán)境(Environmental)傳感器、位置(Position)傳感器。

(1)動作傳感器

這類傳感器在三個軸(x、y、z)上測量加速度和旋轉(zhuǎn)角度。包括如下幾個傳感器:

加速(accelerometer)傳感器、重力(gravity)傳感器、陀螺儀(gyroscope)傳感器、旋轉(zhuǎn)向量(rotational vector )傳感器
下面來看一下傳感器世界的坐標系:

傳感器世界的坐標系

是不是已經(jīng)有點感覺了。

(2)環(huán)境傳感器

這類傳感器可以測量不同環(huán)境的參數(shù),例如,周圍環(huán)境的空氣溫度和壓強、光照強度和濕度。包括如下幾個傳感器:

濕度(barometer)傳感器、光線(photometer)傳感器、溫度(thermometer)傳感器

(3)位置傳感器

這類傳感器可以測量設(shè)備的物理位置。包括如下幾個傳感器:

方向(orientation)傳感器、磁力(magnetometer)傳感器

了解后我們就開始進入傳感器的編程工作了,接下來我們看一下Android為我們提供的傳感器框架(Android sensor framework,簡稱ASF)。

2.Android傳感器框架

Android SDK為我們提供了ASF,可以用來訪問當(dāng)前Android設(shè)備內(nèi)置的傳感器。ASF提供了很多類和接口,幫助我們完成各種與傳感器有關(guān)的任務(wù)。例如:

1)確定當(dāng)前Android設(shè)備內(nèi)置了哪些傳感器。

2)確定某一個傳感器的技術(shù)指標。

3)獲取傳感器傳回來的數(shù)據(jù),以及定義傳感器回傳數(shù)據(jù)的精度。

4)注冊和注銷傳感器事件監(jiān)聽器,這些監(jiān)聽器用于監(jiān)聽傳感器的變化,通常從傳感器回傳的數(shù)據(jù)需要利用這些監(jiān)聽器完成。

ASF允許我們訪問很多傳感器類型,這些傳感器有一些是基于硬件的傳感器,還有一些是基于軟件的傳感器?;谟布膫鞲衅骶褪侵苯右孕酒问角度氲紸ndroid設(shè)備中,這些傳感器直接從外部環(huán)境獲取數(shù)據(jù)。基于軟件的傳感器并不是實際的硬件芯片,基于軟件的傳感器傳回的數(shù)據(jù)本質(zhì)上也來自于基于硬件的傳感器,只是這些數(shù)據(jù)通常會經(jīng)過二次加工。所以基于軟件的傳感器也可以稱為虛擬(virtual)傳感器或合成(synthetic)傳感器。

Android對每個設(shè)備的傳感器都進行了抽象,其中SensorManger類用來控制傳感器,Sensor用來描述具體的傳感器,SensorEventListener用來監(jiān)聽傳感器值的改變。

(1)SensorManager類

用于創(chuàng)建sensor service的實例。該類提供了很多用于訪問和枚舉傳感器,注冊和注銷傳感器監(jiān)聽器的方法。而且還提供了與傳感器精度、掃描頻率、校正有關(guān)的常量。

(2)Sensor類

Sensor類為我們提供了一些用于獲取傳感器技術(shù)參數(shù)的方法。如版本、類型、生產(chǎn)商等。例如所有傳感器的TYPE類型如下:
注意:1-8是硬件傳感器,9是軟件傳感器,其中方向傳感器的數(shù)據(jù)來自重力和磁場傳感器,10-12是硬件或軟件傳感器。

序號 傳感器 Sensor類中定義的TYPE常量
1 加速度傳感器 TYPE_ACCELEROMETER
2 溫度傳感器 TYPE_AMBIENT_TEMPERATURE
3 陀螺儀傳感器 TYPE_GYROSCOPE
4 光線傳感器 TYPE_LIGHT
5 磁場傳感器 TYPE_MAGNETIC_FIELD
6 壓力傳感器 TYPE_PRESSURE
7 臨近傳感器 TYPE_PROXIMITY
8 濕度傳感器 TYPE_RELATIVE_HUMIDITY
9 方向傳感器 TYPE_ORIENTATION
10 重力傳感器 TYPE_GRAVITY
11 線性加速傳感器 TYPE_LINEAR_ACCELERATION
12 旋轉(zhuǎn)向量傳感器 TYPE_ROTATION_VECTOR

(3)SensorEvent類

系統(tǒng)使用該類創(chuàng)建傳感器事件對象。該對象可以提供與傳感器事件有關(guān)的信息。傳感器事件對象包括的信息有原始的傳感器回傳數(shù)據(jù)、傳感器類型、數(shù)據(jù)的精度以及觸發(fā)事件的時間。

(4)SensorEventListener接口

該接口包含兩個回調(diào)方法,當(dāng)傳感器的回傳值或精度發(fā)生變化時,系統(tǒng)會調(diào)用這兩個回調(diào)方法。

/**
 * 傳感器精度變化時回調(diào)
 */
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
/**
 * 傳感器數(shù)據(jù)變化時回調(diào)
 */
@Override
public void onSensorChanged(SensorEvent event) {
}

到了這里,我們就可以進行傳感器開發(fā)工作了。

3.獲取傳感器技術(shù)參數(shù)

下來我們編寫代碼來獲取一下自己手機的傳感器技術(shù)參數(shù)。

TextView tvSensors = (TextView) findViewById(R.id.tv_sensors);
//獲取傳感器SensorManager對象
SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ALL);
for (Sensor sensor : sensors) {
  tvSensors.append(sensor.getName() + "\n");
}

先運行一下看看效果:

貌似我的手機傳感器還不少,哈哈。注意此處必須用實體機測試哦。

下來我們分別看一下動作傳感器、環(huán)境傳感器和位置傳感器的組成及使用方法。

4.動作傳感器的組成及使用方法

所有的動作傳感器都會返回三個浮點數(shù)的值(通過長度為3的數(shù)組返回),但對于不同的傳感器,這三個只是意義不同。例如,對于加速傳感器,會返回三個坐標軸的數(shù)據(jù)。對于陀螺儀傳感器,會返回三個坐標軸的旋轉(zhuǎn)角速度。

注意:動作傳感器本身一般并不會用于監(jiān)測設(shè)備的位置,關(guān)于設(shè)備的位置需要用其他類型的傳感器進行監(jiān)測,例如,磁場傳感器。

(1)加速度傳感器

加速度傳感器需要結(jié)合重力傳感器使用,以減少加速度受重力的影響。首先需要實現(xiàn)SensorEventListener接口,添加回調(diào)方法,然后獲取傳感器SensorManager對象,注冊傳感器,然后我們就可以監(jiān)聽傳感器的變化了。示例代碼如下:

public class SensorActivity extends AppCompatActivity implements SensorEventListener {
  private TextView tvAccelerometer;
  private SensorManager mSensorManager;
  private float[] gravity = new float[3];
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sensor);
    tvAccelerometer = (TextView) findViewById(R.id.tv_accelerometer);
    //獲取傳感器SensorManager對象
    mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
  }
  /**
   * 傳感器精度變化時回調(diào)
   */
  @Override
  public void onAccuracyChanged(Sensor sensor, int accuracy) {
  }
  /**
   * 傳感器數(shù)據(jù)變化時回調(diào)
   */
  @Override
  public void onSensorChanged(SensorEvent event) {
    //判斷傳感器類別
    switch (event.sensor.getType()) {
      case Sensor.TYPE_ACCELEROMETER: //加速度傳感器
        final float alpha = (float) 0.8;
        gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
        gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
        gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];

        String accelerometer = "加速度傳感器\n" + "x:"
            + (event.values[0] - gravity[0]) + "\n" + "y:"
            + (event.values[1] - gravity[1]) + "\n" + "z:"
            + (event.values[2] - gravity[2]);
        tvAccelerometer.setText(accelerometer);
        //重力加速度9.81m/s^2,只受到重力作用的情況下,自由下落的加速度
        break;
      case Sensor.TYPE_GRAVITY://重力傳感器
        gravity[0] = event.values[0];//單位m/s^2
        gravity[1] = event.values[1];
        gravity[2] = event.values[2];
        break;
      default:
        break;
    }
  }
  /**
   * 界面獲取焦點,按鈕可以點擊時回調(diào)
   */
  protected void onResume() {
    super.onResume();
    //注冊加速度傳感器
    mSensorManager.registerListener(this,
        mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),//傳感器TYPE類型
        SensorManager.SENSOR_DELAY_UI);//采集頻率
    //注冊重力傳感器
    mSensorManager.registerListener(this,
        mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY),
        SensorManager.SENSOR_DELAY_FASTEST);
  }
  /**
   * 暫停Activity,界面獲取焦點,按鈕可以點擊時回調(diào)
   */
  @Override
  protected void onPause() {
    super.onPause();
    mSensorManager.unregisterListener(this);
  }

}

我們將手機水平正面朝上放置于桌子上,看一下效果圖:

我們可以看到正值和負值,那什么情況是正值?什么情況是負值呢?

設(shè)備沿x軸正方向推動,x軸加速度為正值。

設(shè)備沿y軸正方向推動,y軸加速度為正值。

如果沿z軸正方向推動,此時手機相對于桌子水平正面朝上放置,z軸加速度為正值。由底部朝著頂部以a m/s^2的加速度推動,那么z軸的加速度為a + 9.81,所以如果計算實際的加速度(抵消重力加速度),需要減9.81。

5.位置傳感器的組成及使用方法

Android提供了磁場傳感器和方向傳感器用于確定設(shè)備的位置,還提供了測量設(shè)備正面到某一個鄰近物體距離的傳感器(鄰近傳感器)。

鄰近傳感器在手機中很常見。像接聽電話時手機屏幕滅屏就是使用的鄰近傳感器。方向傳感器是基于軟件的,該傳感器的回傳數(shù)據(jù)來自加速度傳感器和磁場傳感器。

位置傳感器對于確定設(shè)備在真實世界中的物理位置非常有用。例如,可以組合磁場傳感器和加速度傳感器測量設(shè)備相對于地磁北極的位置,還可以利用方向傳感器確定當(dāng)前設(shè)備相對于自身參照系的位置。

磁場傳感器和方向傳感器都返回值3個值(SensorEvent.values),而鄰近傳感器只返回1個值。

下面我們具體看一下他們的返回值:

方向傳感器:

  • SensorEvent.values[0]:繞著Z軸旋轉(zhuǎn)的角度。如果Y軸(正常拿手機的方向)正對著北方,該值是0,如果Y軸指向南方,改值是180,Y軸指向東方,該值是90,如果Y軸指向西方,該值是270。
  • SensorEvent.values[1]:繞著X軸旋轉(zhuǎn)的度數(shù)。當(dāng)從Z軸正方向朝向Y軸正方向,改值為正值。反之,為負值。該值在180至-180之間變動。
  • SensorEvent.values[2]:繞著Y軸旋轉(zhuǎn)的度數(shù)。當(dāng)從Z軸正方向朝向X軸正方向,改值為正值。反之,為負值。該值在180至-180之間變動。

磁場傳感器:

  • SensorEvent.values[0]:沿著X軸的磁力(μT,millitesla)
  • SensorEvent.values[1]:沿著Y軸的磁力(μT,millitesla)
  • SensorEvent.values[2]:沿著Y軸的磁力(μT,millitesla)

鄰近傳感器:

SensorEvent.values[0]:手機正面距離鄰近物理的距離(CM)

(1)臨近傳感器

這里以臨近傳感器作為示例工程實現(xiàn)一下,其他傳感器實現(xiàn)大同小異。

public class SensorActivity extends AppCompatActivity implements SensorEventListener {
  private TextView tvProximity;
  private SensorManager mSensorManager;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_motion_sensor);
    tvProximity = (TextView) findViewById(R.id.tv_proximity);
    //獲取傳感器SensorManager對象
    mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
  }
  /**
   * 傳感器精度變化時回調(diào)
   */
  @Override
  public void onAccuracyChanged(Sensor sensor, int accuracy) {
  }
  /**
   * 傳感器數(shù)據(jù)變化時回調(diào)
   */
  @Override
  public void onSensorChanged(SensorEvent event) {
    //判斷傳感器類別
    switch (event.sensor.getType()) {
      case Sensor.TYPE_PROXIMITY://臨近傳感器
        tvProximity.setText(String.valueOf(event.values[0]));
        break;
      default:
        break;
    }
  }
  /**
   * 界面獲取焦點,按鈕可以點擊時回調(diào)
   */
  protected void onResume() {
    super.onResume();
    //注冊臨近傳感器
    mSensorManager.registerListener(this,
        mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY),
        SensorManager.SENSOR_DELAY_UI);
  }
  /**
   * 暫停Activity,界面獲取焦點,按鈕可以點擊時回調(diào)
   */
  @Override
  protected void onPause() {
    super.onPause();
    mSensorManager.unregisterListener(this);
  }

}

運行程序,我間斷的擋住臨近傳感器,看一下效果圖:

0.0是我擋住臨近傳感器時候的值,8.0是我將手移開時的值。

下面我們再來看一個比較叼的傳感器,與自然息息相關(guān)。

6.環(huán)境傳感器的組成及使用方法

Android提供了用于檢測不同的外部環(huán)境的傳感器。例如,可以檢測周圍空氣的濕度、光線、空氣的壓強和溫度,這些傳感器都是基于硬件的傳感器。除了光線傳感器外,其他傳感器在普通的Android設(shè)備中很少見。所以如果使用環(huán)境傳感器,最好運行時對當(dāng)前Android設(shè)備所支持的傳感器進行檢測。

(1)環(huán)境傳感器的返回值

大多數(shù)動作傳感器和位置傳感器都返回多個值,而所有的環(huán)境傳感器都只返回一個值:

傳感器 TYPE值 返回值 單位
溫度傳感器 TYPE_AMBIENT_TEMPERATURE event.values[0] °C
壓力傳感器 TYPE_PRESSURE event.values[0] hPa
光線傳感器 TYPE_LIGHT event.values[0] lx
濕度傳感器 TYPE_RELATIVE_HUMIDITY event.values[0] RH(%)

注意:環(huán)境傳感器返回的值很少受到雜音的干擾,而動作和位置傳感器經(jīng)常需要消除雜音的影響。例如,加速度傳感器要消除重力對其回傳值的影響。

(2)光線傳感器回傳數(shù)據(jù)

//最強的光線強度(估計只有沙漠地帶才能達到這個值)
public static final float LIGHT_SUNLIGHT_MAX = 120000.0f;
//萬里無云時陽光直射的強度
public static final float LIGHT_SUNLIGHT = 110000.0f;
//有陽光,但被云彩抵消了部分光線時的強度
public static final float LIGHT_SHADE = 20000.0f;
//多云時的光線強度  
public static final float LIGHT_OVERCAST = 10000.0f;
//太陽剛剛升起時(日出)的光線強度
public static final float LIGHT_SUNRISE = 400.0f;
//在陰雨天,沒有太陽時的光線強度
public static final float LIGHT_CLOUDY = 100.0f;
//夜晚有月亮?xí)r的光線強度
public static final float LIGHT_FULLMOON = 0.25f;
//夜晚沒有月亮?xí)r的光線強度(當(dāng)然,也不能有路燈,就是漆黑一片)
public static final float LIGHT_NO_MOON = 0.001f;

環(huán)境傳感器的使用方法與動作、位置傳感器大同小異,在次不再贅述。

相信通過本篇的學(xué)習(xí),大家的開發(fā)水準都會有一定的提高,而大家的提高是我最欣慰的事情了。也希望大家多多支持腳本之家。

相關(guān)文章

  • 快速解決進入fragment時不能彈出軟件盤的問題

    快速解決進入fragment時不能彈出軟件盤的問題

    下面小編就為大家?guī)硪黄焖俳鉀Q進入fragment時不能彈出軟件盤的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • ListView下拉列表控件使用方法詳解

    ListView下拉列表控件使用方法詳解

    這篇文章主要為大家詳細介紹了ListView下拉列表控件的使用方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Android?之Preference控件基本使用示例詳解

    Android?之Preference控件基本使用示例詳解

    這篇文章主要為大家介紹了Android?之Preference控件基本使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • Android開發(fā)Jetpack組件Lifecycle原理篇

    Android開發(fā)Jetpack組件Lifecycle原理篇

    這一篇文章來介紹Android?Jetpack架構(gòu)組件的Lifecycle;?Lifecycle用于幫助開發(fā)者管理Activity和Fragment?的生命周期,?由于Lifecycle是LiveData和ViewModel的基礎(chǔ);所以需要先學(xué)習(xí)它
    2022-08-08
  • 輕松實現(xiàn)功能強大的Android刮獎效果控件(ScratchView)

    輕松實現(xiàn)功能強大的Android刮獎效果控件(ScratchView)

    這篇文章主要為大家詳細介紹了ScratchView如何一步步打造萬能的Android刮獎效果控件,,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • android.enableD8.desugaring?=?false引發(fā)問題解決

    android.enableD8.desugaring?=?false引發(fā)問題解決

    這篇文章主要為大家介紹了android.enableD8.desugaring?=?false引發(fā)問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • Android自定義View實現(xiàn)環(huán)形進度條的思路與實例

    Android自定義View實現(xiàn)環(huán)形進度條的思路與實例

    最近看到豆瓣FM的音樂播放界面,有一個環(huán)形的進度條挺不錯的,最近有空就想著實現(xiàn)了,所以下面這篇文章主要給大家介紹了Android自定義View實現(xiàn)環(huán)形進度條的思路與實例,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-04-04
  • Android去除煩人的默認閃退Dialog

    Android去除煩人的默認閃退Dialog

    這篇文章主要為大家詳細介紹了Android去除煩人的默認閃退Dialog的相關(guān)方法,感興趣的小伙伴們可以參考一下
    2016-04-04
  • Android Studio用genymotion運行后小圖標無法顯示問題

    Android Studio用genymotion運行后小圖標無法顯示問題

    這篇文章主要介紹了Android Studio用genymotion運行后小圖標無法顯示的問題,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • Flutter質(zhì)感設(shè)計之底部導(dǎo)航

    Flutter質(zhì)感設(shè)計之底部導(dǎo)航

    這篇文章主要為大家詳細介紹了Flutter質(zhì)感設(shè)計之底部導(dǎo)航的相關(guān)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08

最新評論