傳感器的介紹

今天面試,突然有需求是通過記錄步數(shù)來達(dá)到領(lǐng)取優(yōu)惠劵的目的(計步傳感器),頓時我就懵比了,雖然會點(diǎn),之前項(xiàng)目中很少用到。我現(xiàn)在就帶領(lǐng)大家了解了解,有不對的地方多多指教。

記住在學(xué)習(xí)中,難免會碰到一些困難,給我們帶來煩惱。成績較差,雖然自己努力了,卻總不見效;練習(xí)立定跳遠(yuǎn),卻總是跳不過那根優(yōu)秀線……這樣的例子有很多。當(dāng)我們遇到這些困難時,該擁用怎樣的心態(tài)?我們“班務(wù)欄”里“班級目標(biāo)”后寫著一句話:“每天進(jìn)步一點(diǎn)”。我們就是要抱著這種良好的心態(tài),努力學(xué)習(xí),爭取每天進(jìn)步一點(diǎn)。

傳感器的使用

1.加速度傳感器

2.磁場傳感器

3.方向傳感器

4.陀螺儀傳感器

5.重力傳感器

6.線性加速度傳感器

7.溫度傳感器

8.光線傳感器

9.距離傳感器

10.壓力傳感器

11.計步傳感器

1. 首先先查看測試的安卓機(jī)擁有的傳感器

這里先初始化一個SensorManager的對象,然后把所有支持的sensor類型log日志打印出來看看。

SensorManager mSensorManager;
List<Sensor> sensorList;
// 實(shí)例化傳感器管理者
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
// 得到設(shè)置支持的所有傳感器的List
sensorList = mSensorManager.getSensorList(Sensor.TYPE_ALL);
List<String> sensorNameList = new ArrayList<String>();
for (Sensor sensor : sensorList) {
Log.d(TAG, "onResume: "+sensor.getName());
}

下面為大家一一介紹

1.加速度傳感器

在這這之前先了解一下手機(jī)傳感器世界的三維坐標(biāo)

image

首先先創(chuàng)建3個textView來顯示三個方向上的加速度。

先給Activity實(shí)現(xiàn)SensorEventListener接口,后面要不斷要監(jiān)聽來刷新數(shù)據(jù)

 public class MainActivity extends AppCompatActivity implements 
 SensorEventListener {
 然后創(chuàng)建SensorManager對象,如果前面設(shè)置過就不用設(shè)置,然后為它注冊加速度傳感器監(jiān)
聽器,采樣頻率可以自己設(shè)置,一般越高越精準(zhǔn)但是越耗電
private SensorManager sm;
//創(chuàng)建一個SensorManager來獲取系統(tǒng)的傳感器服務(wù)
sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
/*
* 最常用的一個方法 注冊事件
* 參數(shù)1 :SensorEventListener監(jiān)聽器
 * 參數(shù)2 :Sensor 一個服務(wù)可能有多個Sensor實(shí)現(xiàn),此處調(diào)用getDefaultSensor獲取默認(rèn)的
Sensor
 * 參數(shù)3 :模式 可選數(shù)據(jù)變化的刷新頻率,多少微秒取一次。
 * */
 //加速度傳感器
 sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 
  SensorManager.SENSOR_DELAY_NORMAL);
  接下來我們只要監(jiān)聽這個傳感器值的變化,然后更新textView的值就好了
 @Override
 public void onSensorChanged(SensorEvent sensorEvent) {
if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
    float X_lateral = sensorEvent.values[0];
    float Y_longitudinal = sensorEvent.values[1];
    float Z_vertical = sensorEvent.values[2];
    mtextViewx.setText(X_lateral + "");
    mtextViewy.setText(Y_longitudinal + "");
    mtextViewz.setText(Z_vertical + "");
}

}


image

結(jié)果:可以看到放在桌子上的時候x和y軸的加速度幾乎為0,我手機(jī)不太平,而z軸的加速度接近9.8
在activity變?yōu)椴豢梢姷臅r候,傳感器依然在工作,這樣很耗電,所以我們根據(jù)需求可以在onPause方法里面停掉傳感器的工作

@Override
public void onPause() {
sm.unregisterListener(this);
super.onPause();
}
2.磁場傳感器

和加速度計一樣,為sensormanager監(jiān)聽磁場變化即可,吧手機(jī)放在電腦旁邊時候可以清楚看到數(shù)值的變化

 // 為磁場傳感器注冊監(jiān)聽器
 sm.registerListener(this, 
 sm.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), 
 SensorManager.SENSOR_DELAY_NORMAL);
 else if(sensorEvent.sensor.getType() == 
 Sensor.TYPE_MAGNETIC_FIELD){
float X_lateral = sensorEvent.values[0];
float Y_longitudinal = sensorEvent.values[1];
float Z_vertical = sensorEvent.values[2];
mtextView1.setText("x軸的磁場強(qiáng)度\n"+ X_lateral );
mtextView2.setText("y軸的磁場強(qiáng)度\n"+ Y_longitudinal );
mtextView3.setText("z軸的磁場強(qiáng)度\n"+ Z_vertical );
 }
image

3.方向傳感器

這個可以用來做指南針之類的,繞z軸轉(zhuǎn)過的角度為0時大概指向正北。這個TYPE_ORIENTATION接口不夠精確已經(jīng)過時了,可以使用旋轉(zhuǎn)矩陣來代替。這里繞z軸轉(zhuǎn)過的角度是value[0],

詳情看這個博客點(diǎn)擊打開鏈接

// 為方向傳感器注冊監(jiān)聽器
sm.registerListener(this, 
sm.getDefaultSensor(Sensor.TYPE_ORIENTATION), 
SensorManager.SENSOR_DELAY_NORMAL);
else if(sensorEvent.sensor.getType() == 
Sensor.TYPE_ORIENTATION){
float X_lateral = sensorEvent.values[0];
float Y_longitudinal = sensorEvent.values[1];
float Z_vertical = sensorEvent.values[2];
mtextView4.setText("繞z軸轉(zhuǎn)過的角度\n"+ X_lateral );
mtextView5.setText("繞x軸轉(zhuǎn)過的角度\n"+ Y_longitudinal );
mtextView6.setText("繞y軸轉(zhuǎn)過的角度\n"+ Z_vertical );
}

4.陀螺儀傳感器

// 為陀螺儀傳感器注冊監(jiān)聽器
sm.registerListener(this, 
sm.getDefaultSensor(Sensor.TYPE_GYROSCOPE), 
 SensorManager.SENSOR_DELAY_NORMAL);
 else if(sensorEvent.sensor.getType() == 
 Sensor.TYPE_GYROSCOPE){
//需要將弧度轉(zhuǎn)為角度
float X = (float)Math.toDegrees(sensorEvent.values[0]);
float Y = (float)Math.toDegrees(sensorEvent.values[1]);
float Z = (float)Math.toDegrees(sensorEvent.values[2]);
mtextView7.setText("繞x軸轉(zhuǎn)過的角速度\n"+ X );
mtextView8.setText("繞y軸轉(zhuǎn)過的角速度\n"+ Y );
mtextView9.setText("繞z軸轉(zhuǎn)過的角速度\n"+ Z );

5.重力傳感器
就是把重力加速度分解到xyz三個方向上

// 為重力傳感器注冊監(jiān)聽器
sm.registerListener(this, 
sm.getDefaultSensor(Sensor.TYPE_GRAVITY), 
SensorManager.SENSOR_DELAY_NORMAL);
else if(sensorEvent.sensor.getType() == Sensor.TYPE_GRAVITY){
float X = sensorEvent.values[0];
float Y = sensorEvent.values[1];
float Z = sensorEvent.values[2];
mtextViewgx.setText("x方向的重力加速度\n"+ X );
mtextViewgy.setText("Y方向的重力加速度\n"+ Y );
mtextViewgz.setText("Z方向的重力加速度\n"+ Z );

6.線性加速度傳感器
就是去掉重力加速度后各個方向的加速度

// 為線性加速度傳感器注冊監(jiān)聽器
 sm.registerListener(this, 
 sm.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION), 
 SensorManager.SENSOR_DELAY_NORMAL);
else if(sensorEvent.sensor.getType() == 
Sensor.TYPE_LINEAR_ACCELERATION){
float X = sensorEvent.values[0];
float Y = sensorEvent.values[1];
float Z = sensorEvent.values[2];
mtextViewlx.setText("x方向的線性加速度\n"+ X );
mtextViewly.setText("Y方向的線性加速度\n"+ Y );
mtextViewlz.setText("Z方向的線性加速度\n"+ Z );

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • refs: https://developer.android.google.cn/guide/topics/se...
    richy_閱讀 42,920評論 5 31
  • 1.傳感器的定義:傳感器是一種感應(yīng)、檢測裝置 2.傳感器的作用:用于檢測、感應(yīng)設(shè)備的周邊信息;不用類型的傳感器,檢...
    archyly閱讀 1,769評論 0 3
  • Android 傳感器開發(fā)詳解 傳感器 傳感器的分類 方向傳感器 陀螺儀傳感器 磁場傳感器 重力傳感器 線性加速度...
    CarlosLynn閱讀 4,630評論 2 2
  • Android系統(tǒng)提供了對傳感器的支持,如果手機(jī)設(shè)備的硬件提供了這些傳感器,Android應(yīng)用可以通過傳感器來獲取...
    trampcr閱讀 4,497評論 3 12
  • 又逢周末,天氣卻不好,霧霾橙色預(yù)警。女兒寫作業(yè),我做美食,各司其職。今天做了三樣,蒸小南瓜+貓耳面+小麻花。 第一...
    bluesky_afcc閱讀 842評論 2 31

友情鏈接更多精彩內(nèi)容