今天面試,突然有需求是通過記錄步數(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)
首先先創(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 + "");
}
}
結(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 );
}
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 );
}