安卓Sensor分類
Android平臺支持三大類傳感器:
1漂坏、動態(tài)傳感器
這類傳感器測量三個軸向上加速力和旋轉(zhuǎn)力外构。這個類別中包含加速度計(jì)瘸爽、重力傳感器展运、陀螺儀和旋轉(zhuǎn)矢量傳感器活逆。
2轻腺、環(huán)境傳感器
這類傳感器測量各種環(huán)境參數(shù),如環(huán)境氣溫划乖、氣壓、照度和濕度挤土。這個類別中包含氣壓計(jì)琴庵、光度計(jì)和溫度計(jì)。
3仰美、位置傳感器
這類傳感器測量設(shè)備的物理位置迷殿。這個類別中包含屏幕方向傳感器和磁力計(jì)。
傳感器框架概覽
安卓提供了一個傳感器框架來訪問設(shè)備上提供的傳感器并獲取原始數(shù)據(jù)咖杂。傳感器框架提供多個類和接口庆寺,可用于執(zhí)行各種與傳感器相關(guān)的任務(wù)。例如可以使用傳感器框架執(zhí)行以下操作:
1诉字、確定設(shè)備上有哪些傳感器
2懦尝、確定單個傳感器的特性,例如最大量程壤圃、制造商陵霉、功率要求和分辨率。
3伍绳、獲取原始傳感器數(shù)據(jù)并定義獲取傳感器數(shù)據(jù)的最低頻率踊挠。
4、注冊和取消注冊用于監(jiān)控傳感器變化的傳感器事件監(jiān)聽冲杀。
安卓支持的傳感器
利用安卓的傳感器框架效床,可以訪問多種類型的傳感器。有些傳感器基于硬件权谁,有些基于軟件剩檀。基于硬件的傳感器是內(nèi)置在手機(jī)或平板設(shè)備中的物理組件旺芽。這類傳感器通過直接測量特定的環(huán)境屬性(如地磁場強(qiáng)度谨朝、角度變化或加速度)來采集數(shù)據(jù)∩蹋基于軟件的傳感器不是物理設(shè)備字币,它們只是模仿基于硬件的傳感器」猜疲基于軟件的傳感器從一個或多個基于硬件的傳感器獲取數(shù)據(jù)洗出,有時被稱為虛擬傳感器或合成傳感器。比如重力傳感器和線性加速度傳感器就是基于軟件的傳感器图谷。下表列出了安卓平臺支持的傳感器:傳感器框架
安卓傳感器框架是androidd.hardwarer軟件包的一部分翩活,提供給應(yīng)用開發(fā)者的類主要包含了以下類和接口:
SensorManager
使用該類來創(chuàng)建傳感器服務(wù)的實(shí)例阱洪。該類提供了各種方法來訪問和列出傳感器,注冊和取消注冊傳感器事件監(jiān)聽器菠镇,以及獲取屏幕方向的信息冗荸。它還提供了幾個傳感器常量,用于報(bào)告?zhèn)鞲衅骶_度利耍,設(shè)置數(shù)據(jù)采集頻率和校準(zhǔn)傳感器蚌本。它是一個抽象類,封裝了一些傳感器數(shù)據(jù)的交互函數(shù)和監(jiān)聽隘梨,其實(shí)現(xiàn)類為SystemSensorManager程癌,對開發(fā)者不可見。
在安卓應(yīng)用開發(fā)中轴猎,可以使用SensorManager及其相關(guān)接口來執(zhí)行兩個基本任務(wù):
● 識別傳感器和傳感器特性
如果應(yīng)用具有依賴于特定傳感器類型或特性的功能嵌莉,則在運(yùn)行時識別傳感器和傳感器特性非常有用。例如捻脖,您可 能希望識別設(shè)備上的所有傳感器锐峭,以便于停用依賴于不存在的傳感器的應(yīng)用功能。同樣可婶,您可能希望識別特定類型的所有傳感器只祠,以便選擇可以為應(yīng)用帶來最佳性能的傳感器實(shí)現(xiàn)。
下面代碼示例為android傳感器框架識別傳感器和傳感器特性的代碼
private SensorManager sensorManager;
...
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
List<Sensor> deviceSensors = sensorManager.getSensorList(Sensor.TYPE_ALL);
● 監(jiān)控傳感器事件
安卓應(yīng)用開發(fā)者要實(shí)現(xiàn)監(jiān)控原始傳感器數(shù)據(jù)扰肌,需要實(shí)現(xiàn)兩個通過SensorEventListener接口公開的回調(diào)方法:onAccuracyChanged()和onSensorChanged()抛寝。Android系統(tǒng)會在發(fā)生以下情況時調(diào)用這兩個方法:
1.傳感器的準(zhǔn)確度發(fā)生了變化。
在這種情況下曙旭,系統(tǒng)會調(diào)用onAccuracyChange()方法盗舰,為開發(fā)者提供對于發(fā)生變化的Sensor對象的引用以及傳感器的新準(zhǔn)確度。準(zhǔn)確度由以下 4 個狀態(tài)常量之一表示:SENSOR_STATUS_ACCURACY_LOW桂躏、SENSOR_STATUS_ACCURACY_MEDIUM钻趋、SENSOR_STATUS_ACCURACY_HIGH 或 SENSOR_STATUS_UNRELIABLE。
2.傳感器報(bào)告了新值
在這種情況下剂习,系統(tǒng)會調(diào)用 onSensorChanged() 方法蛮位,為您提供 SensorEvent 對象。SensorEvent 對象包含關(guān)于新傳感器數(shù)據(jù)的信息鳞绕,包括:數(shù)據(jù)的準(zhǔn)確度失仁、生成數(shù)據(jù)的傳感器、生成數(shù)據(jù)的時間戳以及傳感器記錄的新數(shù)據(jù)们何。
下面代碼示例展示了使用onSensorChanged()方法監(jiān)控光傳感器的數(shù)據(jù)
public class SensorActivity extends Activity implements SensorEventListener {
private SensorManager sensorManager;
private Sensor mLight;
@Override
public final void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mLight = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
}
@Override
public final void onAccuracyChanged(Sensor sensor, int accuracy) {
// Do something here if sensor accuracy changes.
}
@Override
public final void onSensorChanged(SensorEvent event) {
// The light sensor returns a single value.
// Many sensors return 3 values, one for each axis.
float lux = event.values[0];
// Do something with this sensor value.
}
@Override
protected void onResume() {
super.onResume();
sensorManager.registerListener(this, mLight, SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onPause() {
super.onPause();
sensorManager.unregisterListener(this);
}
}
Sensor
您可以使用這個類來創(chuàng)建特定傳感器的實(shí)例萄焦。該類提供了各種方法來確定傳感器的特性。
SensorEvent
系統(tǒng)使用這個類來創(chuàng)建傳感器事件對象,該對象提供有關(guān)傳感器事件的信息拂封。傳感器事件對象中包含以下信息:原始傳感器數(shù)據(jù)茬射、生成事件的傳感器類型、數(shù)據(jù)的準(zhǔn)確度和事件的時間戳冒签。
SensorEventListener
可以使用此接口創(chuàng)建兩種回調(diào)方法在抛,以在傳感器值或傳感器精確度發(fā)生變化時接收通知(傳感器事件)。
傳感器坐標(biāo)系
一般萧恕,安卓的傳感器框架使用標(biāo)準(zhǔn)的3軸坐標(biāo)系來表示數(shù)據(jù)值刚梭。當(dāng)設(shè)備處于默認(rèn)屏幕方向時,會相對于設(shè)備屏幕來定義坐標(biāo)系(參見圖 1)廊鸥。當(dāng)設(shè)備處于默認(rèn)屏幕方向時,X 軸為水平向右延伸辖所,Y 軸為垂直向上延伸惰说,Z 軸為垂直于屏幕向外延伸。在此坐標(biāo)系中缘回,屏幕后面的坐標(biāo)將具有負(fù) Z 值吆视。以下傳感器使用此坐標(biāo)系:Android傳感器框架Java層類圖
對安卓開放的傳感器框架API的總結(jié)
安卓傳感器框架封裝了各種Sensor數(shù)據(jù)的復(fù)雜處理,其數(shù)據(jù)處理主要在Native層酥宴,在Java層通過SystemSensorManager中的Native方法啦吧,調(diào)用相關(guān)數(shù)據(jù)處理方法,統(tǒng)一抽象為Sensor類拙寡,根據(jù)不同的標(biāo)記值在SensorManager中獲取相應(yīng)的Sensor實(shí)例授滓,使用觀察者模式提供SensorEventListener接口讓應(yīng)用開發(fā)者監(jiān)聽需要的傳感器數(shù)據(jù)變化,變化上報(bào)的數(shù)據(jù)統(tǒng)一抽象為SensorEvent類肆糕,其宗旨就是:封裝了復(fù)雜的數(shù)據(jù)處理般堆,提供簡單統(tǒng)一的接口給開發(fā)者。在鴻蒙系統(tǒng)多模輸入的Sensor框架設(shè)計(jì)提供了很好的借鑒示例诚啃。主要有以下幾點(diǎn):
- 各種類型的傳感器數(shù)據(jù)處理在Native層提供對應(yīng)的類進(jìn)行封裝淮摔,數(shù)據(jù)處理轉(zhuǎn)化為統(tǒng)一的數(shù)據(jù)(android的SensorEvent提供的就是一組Float數(shù)組)
- 使用觀察者模式,提供公共的數(shù)據(jù)變化接口給應(yīng)用層始赎,這也是安卓Framwork層最經(jīng)典的方案和橙。
- 使用數(shù)值來標(biāo)記各種傳感器類型,將傳感器統(tǒng)一封裝為Sensor類造垛,通過標(biāo)記值來獲取對應(yīng)的傳感器實(shí)例魔招。
- 提前考慮鴻蒙系統(tǒng)中傳感器的坐標(biāo)軸的問題,當(dāng)然最簡單的還是和安卓系統(tǒng)的設(shè)計(jì)保持一致五辽,但仍需考慮是否有更優(yōu)方案仆百。