網(wǎng)站建設(shè)策劃實(shí)訓(xùn)總結(jié)谷歌優(yōu)化推廣
目錄
傳感器的定義
三大類型傳感器
1、運(yùn)動(dòng)傳感器
2、環(huán)境傳感器
3、位置傳感器
傳感器開發(fā)框架
1、SensorManager
2、Sensor
3、SensorEvent
4、SensorEventListener
一、使用傳感器開發(fā)步驟
1、獲取傳感器信息
1)、獲取傳感器管理器
2)、獲取設(shè)備的傳感器對(duì)象列表
3)、迭代獲取Sensor對(duì)象,調(diào)用對(duì)應(yīng)方法獲取相關(guān)信息
2、獲取傳感器傳回?cái)?shù)據(jù)
1)獲得傳感器管理器
2)調(diào)用特定方法獲得需要的傳感器
3)實(shí)現(xiàn)SensorEventListener接口,重寫onSensorChanged和onAccuracyChanged方法
4)SensorManager對(duì)象調(diào)用registerListener注冊(cè)監(jiān)聽器
5)監(jiān)聽器的取消注冊(cè)
二、獲取傳感器信息的實(shí)例
三、獲取傳感器傳回?cái)?shù)據(jù)的實(shí)例
原理
??????? 傳感器的應(yīng)用如微信的搖一搖功能、NFC、手機(jī)自帶的指南針等等。下面將學(xué)習(xí)Android傳感器的使用。
傳感器的定義
????????一種物理設(shè)備或者生物器官,能夠探測、感受外界的信號(hào),物理?xiàng)l件(如光,熱, 濕度)或化學(xué)組成(如煙霧),并將探知的信息傳遞給其他的設(shè)備或者器官。
三大類型傳感器
1、運(yùn)動(dòng)傳感器
????????–運(yùn)動(dòng)傳感器測量加速力和旋轉(zhuǎn)力,它們包括加速度計(jì),重力傳感器,陀螺儀和旋轉(zhuǎn)矢量傳感器。
2、環(huán)境傳感器
????????–環(huán)境傳感器測量各種周圍環(huán)境情況,如環(huán)境溫度、氣壓、光強(qiáng)、濕度等。包括氣壓計(jì),光度計(jì)和溫度計(jì)。
3、位置傳感器
????????–位置傳感器測量設(shè)備的物理位置信息,包括方向傳感器和磁力計(jì)。
傳感器開發(fā)框架
1、SensorManager
????????–可以使用此類創(chuàng)建傳感器服務(wù)的實(shí)例。這個(gè)類提供了多種方法來訪問和列出傳感器,注冊(cè)和注銷傳感器事件監(jiān)聽器,并獲取方向信息。該類還提供了幾個(gè)傳感器常量,用于報(bào)告?zhèn)鞲衅鞯木?#xff0c;設(shè)置數(shù)據(jù)采集速率和校準(zhǔn)傳感器。
2、Sensor
????????–可以使用此類創(chuàng)建特定傳感器的實(shí)例。這個(gè)類提供了各種方法,讓你確定一個(gè)傳感器的能力。
3、SensorEvent
????????–系統(tǒng)使用此類創(chuàng)建傳感器事件對(duì)象,該對(duì)象提供有關(guān)傳感器事件的信息。傳感器事件對(duì)象包括以下信息:原始傳感器數(shù)據(jù),生成事件的傳感器類型,數(shù)據(jù)的準(zhǔn)確性以及事件的時(shí)間戳。
4、SensorEventListener
????????–可以使用此界面創(chuàng)建兩種回傳方法,當(dāng)傳感器值更改或傳感器準(zhǔn)確度發(fā)生變化時(shí),會(huì)接收通知(傳感器事件)。
一、使用傳感器開發(fā)步驟
1、獲取傳感器信息
??????? 傳感器的開發(fā)首先需要獲取傳感器的一些信息,獲取信息需要以下步驟:
1)、獲取傳感器管理器
????????Android提供了一個(gè)sensorManager管理器,通過這個(gè)類可以獲取到都有哪些傳感器,獲取sensorManager對(duì)象代碼如下:
SensorManager sm = (SensorManager)getSystemService(SENSOR_SERVICE);
2)、獲取設(shè)備的傳感器對(duì)象列表
????????通過sensorManager管理器的getSensorList()方法,可以獲取傳感器對(duì)象列表,具體代碼如下:
List<Sensor> allSensors = sm.getSensorList(Sensor.TYPE_ALL);
3)、迭代獲取Sensor對(duì)象,調(diào)用對(duì)應(yīng)方法獲取相關(guān)信息
for(Sensor s:allSensors){sensor.getName(); //獲得傳感器名稱sensor.getType(); //獲得傳感器種類sensor.getVendor(); //獲得傳感器供應(yīng)商sensor.getVersion(); //獲得傳感器版本sensor.getResolution(); //獲得精度值sensor.getMaximumRange(); //獲得最大范圍sensor.getPower(); //傳感器使用時(shí)的耗電量
}
2、獲取傳感器傳回?cái)?shù)據(jù)
1)獲得傳感器管理器
SensorManager sm = (SensorManager)getSystemService(SENSOR_SERVICE);
2)調(diào)用特定方法獲得需要的傳感器
????????調(diào)用SensorManager 對(duì)象的getDefaultSensor方法,獲取指定類型的傳感器,例如這里使用光線傳感器,具體代碼:
Sensor mSensorOrientation = sm.getDefaultSensor(Sensor.TYPE_ORIENTATION);
3)實(shí)現(xiàn)SensorEventListener接口,重寫onSensorChanged和onAccuracyChanged方法
①:onSensorChanged(SensorEvent event);該方法在傳感器的值發(fā)生改變的時(shí)候調(diào)用,其參數(shù)是一個(gè)SensorEvent 對(duì)象,通過該對(duì)象的values屬性可以獲取傳感器的值,該值是一個(gè)數(shù)組,該變量最多有三個(gè)元素,而且傳感器不同,對(duì)應(yīng)元素代表的含義也不同
②:onAccuracyChanged(Sensor sensor , int accuracy);當(dāng)傳感器的進(jìn)度發(fā)生改變時(shí)會(huì)回調(diào),
參數(shù)說明:
sensor:傳感器對(duì)象
accuracy:表示傳感器新的精度
@Override
public void onSensorChanged(SensorEvent event) {final float[] _Data = event.values;this.mService.onSensorChanged(_Data[0],_Data[1],_Data[2]);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
4)SensorManager對(duì)象調(diào)用registerListener注冊(cè)監(jiān)聽器
????????為傳感器注冊(cè)監(jiān)聽事件,通過調(diào)用sensorManager對(duì)象的registerListener()方法來注冊(cè)監(jiān)聽事件。
??????? 第一個(gè)參數(shù)是上下文對(duì)象,第二個(gè)是傳感器對(duì)象,第三個(gè)是傳感器的延時(shí)時(shí)間的精密程 度,越精密越耗電。
????????
- SENSOR_DELAY_FASTEST——延時(shí):0ms
- SENSOR_DELAY_GAME——延時(shí):20ms
- SENSOR_DELAY_UI——延時(shí):60ms
- SENSOR_DELAY_NORMAL——延時(shí):200ms
具體代碼如下:
sm.registerListener(mContext, mSensorOrientation, android.hardware.SensorManager.SENSOR_DELAY_UI);
5)監(jiān)聽器的取消注冊(cè)
sm. unregisterListener(this);
二、獲取傳感器信息的實(shí)例
??????? 先將前面第一個(gè)步驟:獲取傳感器信息,實(shí)例演示一下如何使用。
新建項(xiàng)目SensorDemo1。
修改activity_main.xml代碼如下:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><ScrollViewandroid:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:id="@+id/txt_show"android:layout_width="match_parent"android:layout_height="match_parent" /></ScrollView></androidx.constraintlayout.widget.ConstraintLayout>
修改MainActivity代碼如下:
public class MainActivity extends AppCompatActivity {private TextView txt_show;private SensorManager sm;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);txt_show = (TextView) findViewById(R.id.txt_show);List<Sensor> allSensors = sm.getSensorList(Sensor.TYPE_ALL);StringBuilder sb = new StringBuilder();sb.append("此手機(jī)有" + allSensors.size() + "個(gè)傳感器,分別有:\n\n");for(Sensor s:allSensors){switch (s.getType()){case Sensor.TYPE_ACCELEROMETER:sb.append(s.getType() + " 加速度傳感器(Accelerometer sensor)" + "\n");break;case Sensor.TYPE_GYROSCOPE:sb.append(s.getType() + " 陀螺儀傳感器(Gyroscope sensor)" + "\n");break;case Sensor.TYPE_LIGHT:sb.append(s.getType() + " 光線傳感器(Light sensor)" + "\n");break;case Sensor.TYPE_MAGNETIC_FIELD:sb.append(s.getType() + " 磁場傳感器(Magnetic field sensor)" + "\n");break;case Sensor.TYPE_ORIENTATION:sb.append(s.getType() + " 方向傳感器(Orientation sensor)" + "\n");break;case Sensor.TYPE_PRESSURE:sb.append(s.getType() + " 氣壓傳感器(Pressure sensor)" + "\n");break;case Sensor.TYPE_PROXIMITY:sb.append(s.getType() + " 距離傳感器(Proximity sensor)" + "\n");break;case Sensor.TYPE_TEMPERATURE:sb.append(s.getType() + " 溫度傳感器(Temperature sensor)" + "\n");break;default:sb.append(s.getType() + " 其他傳感器" + "\n");break;}sb.append("設(shè)備名稱:" + s.getName() + "\n 設(shè)備版本:" + s.getVersion() + "\n 供應(yīng)商:"+ s.getVendor() + "\n\n");}txt_show.setText(sb.toString());}
}
效果如下:
?
三、獲取傳感器傳回?cái)?shù)據(jù)的實(shí)例
?????????? 實(shí)現(xiàn)前面第二個(gè)步驟:獲取傳感器傳回?cái)?shù)據(jù),實(shí)例演示一下如何使用。下面實(shí)現(xiàn)采集方向傳感器數(shù)據(jù)。
原理
?
?
新建項(xiàng)目SensorDemo2。
修改activity_main.xml代碼如下:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:padding="5dp"><TextViewandroid:id="@+id/tv_value1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:text="方位角"android:textSize="18sp"android:textStyle="bold" /><TextViewandroid:id="@+id/tv_value2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:text="傾斜角"android:textSize="18sp"android:textStyle="bold" /><TextViewandroid:id="@+id/tv_value3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:text="滾動(dòng)角"android:textSize="18sp"android:textStyle="bold" /></LinearLayout></androidx.constraintlayout.widget.ConstraintLayout>
修改MainActivity代碼如下:
????????
SENSOR_DELAY_FASTEST最靈敏
SENSOR_DELAY_GAME 游戲的時(shí)候,不過一般用這個(gè)就夠了
SENSOR_DELAY_NORMAL 比較慢。
SENSOR_DELAY_UI 最慢的
public class MainActivity extends AppCompatActivity implements SensorEventListener {private TextView tv_value1;private TextView tv_value2;private TextView tv_value3;private SensorManager sManager;private Sensor mSensorOrientation;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);sManager = (SensorManager) getSystemService(SENSOR_SERVICE);mSensorOrientation = sManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);sManager.registerListener(this, mSensorOrientation, SensorManager.SENSOR_DELAY_UI);bindViews();}private void bindViews() {tv_value1 = (TextView) findViewById(R.id.tv_value1);tv_value2 = (TextView) findViewById(R.id.tv_value2);tv_value3 = (TextView) findViewById(R.id.tv_value3);}@Overridepublic void onSensorChanged(SensorEvent event) {tv_value1.setText("方位角(沿Z軸):" + (float) (Math.round(event.values[0] * 100)) / 100);tv_value2.setText("傾斜角(沿X軸):" + (float) (Math.round(event.values[1] * 100)) / 100);tv_value3.setText("滾動(dòng)角(沿Y軸):" + (float) (Math.round(event.values[2] * 100)) / 100);}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {}@Overrideprotected void onDestroy() {super.onDestroy();sManager.unregisterListener(this);}
}
效果如下:
?
下篇文章將通過靠近屏幕黑屏和計(jì)步器兩個(gè)案例實(shí)踐一下傳感器的應(yīng)用。