傳感器
傳感器Sensor是一種檢測(cè)裝置歌豺,能感受到被測(cè)量的信息,并能將感受到的信息心包,按一定規(guī)律變換成為電信號(hào)或其他所需形式的信息輸出类咧,以滿足信息的傳輸、處理、存儲(chǔ)痕惋、顯示区宇、記錄和控制等要求。
中國(guó)物聯(lián)網(wǎng)校企聯(lián)盟認(rèn)為值戳,傳感器的存在和發(fā)展议谷,讓物體有了觸覺(jué)、味覺(jué)和嗅覺(jué)等感官堕虹,讓物體慢慢變得活了起來(lái)卧晓。
人們?yōu)榱藦耐饨绔@取信息,必須借助于感覺(jué)器官鲫凶。 而單靠人們自身的感覺(jué)器官禀崖,在研究自然現(xiàn)象和規(guī)律以及生產(chǎn)活動(dòng)中它們的功能就遠(yuǎn)遠(yuǎn)不夠了。為適應(yīng)這種情況螟炫,就需要傳感器波附。因此可以說(shuō),傳感器是人類五官的延長(zhǎng)昼钻,又稱之為電五官掸屡。
傳感器類型
Sensor.TYPE_AMBIENT_TEMPERATURE;溫度傳感器(API 14引入Android 4.0)
Sensor.TYPE_ACCELEROMETER;加速度傳感器
Sensor.TYPE_GRAVITY;重力傳感器
Sensor.TYPE_LINEAR_ACCELERATION;線性加速度傳感器
Sensor.TYPE_GYROSCOPE;陀螺儀傳感器
Sensor.TYPE_ROTATION_VECTOR;設(shè)備的方向,表示為三個(gè)軸的角度組合(旋轉(zhuǎn)向量)
Sensor.TYPE_MAGNETIC_FIELD;磁力傳感器
Sensor.TYPE_PROXIMITY;近距離傳感器
Sensor.TYPE_RELATIVE_HUMIDITY;相對(duì)濕度傳感器(API 14引入 Android 4.0)
Sensor.TYPE_LIGHT;環(huán)境光傳感器
使用傳感器
獲取SensorManager管理器
getSystemService(Context.SENSOR_SERVICE)
通過(guò)SensorManager獲取傳感器
注冊(cè)傳感器監(jiān)聽(tīng)
SensorManager.registerListener(SensorEventListener listener, Sensor sensor, int samplingPeriodUs)
listener:監(jiān)聽(tīng)器
sensor:傳感器
samplingPeriodUs:采集周期
移除傳感器監(jiān)聽(tīng)
SensorManager.unregisterListener()
涉及相關(guān)類
SensorManager
List< Sensor> getSensorList(Sensor.type) 獲取傳感器(多個(gè))
Sensor getDefaultSensor(Sensor.type) 獲取默認(rèn)傳感器
boolean cancelTriggerSensor(TriggerEventListener listener, Sensor sensor)取消接收的觸發(fā)事件為觸發(fā)傳感器然评。
boolean flush(SensorEventListener listener)刷新所有傳感器的FIFO注冊(cè)偵聽(tīng)器仅财。
float getAltitude(float p0, float p)計(jì)算海拔米的海平面大氣壓力和壓力。
void getAngleChange(float[] angleChange, float[] R, float[] prevR)計(jì)算兩個(gè)旋轉(zhuǎn)矩陣之間的角度變化碗淌。
float getInclination(float[] I)計(jì)算從我返回getRotationMatrix(float[], float[], float[], float[])傾斜弧度矩陣地磁傾角
float[] getOrientation(float[] R, float[] values)計(jì)算基于旋轉(zhuǎn)矩陣設(shè)備的方向盏求。
void getQuaternionFromVector(float[] Q, float[] rv)輔助功能旋轉(zhuǎn)向量轉(zhuǎn)換為四元數(shù)歸。給定一個(gè)旋轉(zhuǎn)矢量(大概從ROTATION_VECTOR傳感器)時(shí)亿眠,返回一個(gè)歸四元陣列Q的四元數(shù)的形式存儲(chǔ)在[W碎罚,X,Y纳像,Z]
boolean getRotationMatrix(float[] R, float[] I, float[] gravity, float[] geomagnetic)可以計(jì)算出旋轉(zhuǎn)矩陣
void getRotationMatrixFromVector(float[] R, float[] rotationVector)輔助函數(shù)來(lái)旋轉(zhuǎn)矢量轉(zhuǎn)換為旋轉(zhuǎn)矩陣荆烈。
boolean remapCoordinateSystem(float[] inR, int X, int Y, float[] outR)旋轉(zhuǎn)供給旋轉(zhuǎn)矩陣,以便它表示不同的坐標(biāo)系中竟趾。
boolean requestTriggerSensor(TriggerEventListener listener, Sensor sensor)請(qǐng)接受觸發(fā)事件的觸發(fā)傳感器憔购。
Sensor
int getFifoMaxEventCount() 獲取該傳感器能分批處理的事件的最大數(shù)量。
如果這個(gè)值是零岔帽,表明批處理模式不支持此傳感器玫鸟。如果其他應(yīng)用程序登記到成批的傳感器,可以進(jìn)行批處理事件的實(shí)際數(shù)目可能是較小的犀勒,因?yàn)橛布﨔IFO將被部分用于批處理的另一傳感器鞋邑。int getFifoReservedEventCount() 保留此傳感器中的分批方式的FIFO的事件數(shù)诵次。給出了對(duì)可批處理事件的最小數(shù)量的保證。
int getMaxDelay() 傳感器最大延遲(微秒)
此值僅用于連續(xù)和按變化的傳感器所定義枚碗。它是對(duì)應(yīng)于該傳感器支持的最低頻率兩個(gè)傳感事件之間的延遲逾一。當(dāng)較低的頻率通過(guò)registerListener請(qǐng)求()事件將在該頻率產(chǎn)生代替。它可以用于估計(jì)當(dāng)批量FIFO可以充分肮雨。舊設(shè)備可以將該值設(shè)置為零遵堵。忽略此值的情況下為負(fù)數(shù)或零。int getMinDelay() 傳感器最小延遲(微秒)
float getMaximumRange() 獲取傳感器最大值
String getName() 獲取傳感器名稱
float getPower() 獲取傳感器耗電量
int getReportingMode() 報(bào)告模式為輸入傳感器怨规,REPORTING_MODE_* 常量
REPORTING_MODE_CONTINUOUS
REPORTING_MODE_ON_CHANGE
REPORTING_MODE_ONE_SHOT
REPORTING_MODE_SPECIAL_TRIGGERfloat getResolution() 獲取在傳感器單元中的傳感器的分辨率
String getStringType() 該傳感器作為字符串的類型陌宿。
int getType() 獲取該傳感器的類型
String getVendor() 獲取傳感器的供應(yīng)商
int getVersion() 傳感器模塊的版本
boolean isWakeUpSensor() 當(dāng)傳感器是喚醒狀態(tài)返回true
SensorEventListener
- onSensorChanged(SensorEvent) 當(dāng)傳感器值發(fā)生改變時(shí)
SensorEvent
values數(shù)組,傳感器值波丰,該值根據(jù)傳感器類型不同返回不同
sensor產(chǎn)生事件的傳感器
accuracy這個(gè)事件的準(zhǔn)確性
timestamp時(shí)間發(fā)生周期納秒 - onAccuracyChanged(Sensor,int) 當(dāng)傳感器的精度發(fā)生變化時(shí)
用以下四個(gè)狀態(tài)常量之一來(lái)代表的
SENSOR_STATUS_ACCURACY_LOW:傳感器報(bào)告低精度值
SENSOR_STATUS_ACCURACY_MEDIUM:傳感器報(bào)告平均精度值
SENSOR_STATUS_ACCURACY_HIGH:傳感器報(bào)告高精度值
SENSOR_STATUS_UNRELIABLE:傳感器報(bào)告的精度值不可靠
最后舉個(gè)例子:(通過(guò)光傳感器改變背景顏色)
布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:id="@+id/main_bg"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.rair.sensordemo.MainActivity">
</RelativeLayout>
代碼:
public class MainActivity extends AppCompatActivity implements SensorEventListener {
private SensorManager sm;
private String TAG = "Rair";
private RelativeLayout mainBg;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
mainBg = (RelativeLayout) findViewById(R.id.main_bg);
//1壳坪、獲取SensorManager
sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
//2、獲取所有的Sensor掰烟,也可以獲取某類型的所有傳感器
List<Sensor> sensorList = sm.getSensorList(Sensor.TYPE_ALL);
for (Sensor sensor : sensorList) {
Log.i(TAG, sensor.getName());
}
//3爽蝴、獲取默認(rèn)的光感傳感器
Sensor defaultSensor = sm.getDefaultSensor(Sensor.TYPE_LIGHT);
//4、注冊(cè)傳感器監(jiān)聽(tīng)器
sm.registerListener(this, defaultSensor, SensorManager.SENSOR_DELAY_FASTEST);
}
@Override
public void onSensorChanged(SensorEvent event) {
float value = event.values[0];
Log.i(TAG, "light value" + value);
if (value >= 255) {
value = 255;
} else if (value <= 0) {
value = 0;
}
int rgb = Color.rgb((int) value, 110, (int) value);
mainBg.setBackgroundColor(rgb);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override
protected void onDestroy() {
super.onDestroy();
//5纫骑、注銷傳感器監(jiān)聽(tīng)器
sm.unregisterListener(this);
}
}
Log:
運(yùn)行一下蝎亚,效果: