Android Sensor傳感器框架API

安卓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):

  1. 各種類型的傳感器數(shù)據(jù)處理在Native層提供對應(yīng)的類進(jìn)行封裝淮摔,數(shù)據(jù)處理轉(zhuǎn)化為統(tǒng)一的數(shù)據(jù)(android的SensorEvent提供的就是一組Float數(shù)組)
  2. 使用觀察者模式,提供公共的數(shù)據(jù)變化接口給應(yīng)用層始赎,這也是安卓Framwork層最經(jīng)典的方案和橙。
  3. 使用數(shù)值來標(biāo)記各種傳感器類型,將傳感器統(tǒng)一封裝為Sensor類造垛,通過標(biāo)記值來獲取對應(yīng)的傳感器實(shí)例魔招。
  4. 提前考慮鴻蒙系統(tǒng)中傳感器的坐標(biāo)軸的問題,當(dāng)然最簡單的還是和安卓系統(tǒng)的設(shè)計(jì)保持一致五辽,但仍需考慮是否有更優(yōu)方案仆百。

來自:https://www.yuque.com/zestzone/bdds6v/oc2in3

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市奔脐,隨后出現(xiàn)的幾起案子俄周,更是在濱河造成了極大的恐慌吁讨,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件峦朗,死亡現(xiàn)場離奇詭異建丧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)波势,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進(jìn)店門翎朱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人尺铣,你說我怎么就攤上這事拴曲。” “怎么了凛忿?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵澈灼,是天一觀的道長。 經(jīng)常有香客問我店溢,道長叁熔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任床牧,我火速辦了婚禮荣回,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘戈咳。我一直安慰自己心软,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布著蛙。 她就那樣靜靜地躺著糯累,像睡著了一般。 火紅的嫁衣襯著肌膚如雪册踩。 梳的紋絲不亂的頭發(fā)上泳姐,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天,我揣著相機(jī)與錄音暂吉,去河邊找鬼胖秒。 笑死,一個胖子當(dāng)著我的面吹牛慕的,可吹牛的內(nèi)容都是我干的阎肝。 我是一名探鬼主播,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼肮街,長吁一口氣:“原來是場噩夢啊……” “哼风题!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤沛硅,失蹤者是張志新(化名)和其女友劉穎眼刃,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體摇肌,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡擂红,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了围小。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昵骤。...
    茶點(diǎn)故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖肯适,靈堂內(nèi)的尸體忽然破棺而出变秦,到底是詐尸還是另有隱情,我是刑警寧澤框舔,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布蹦玫,位于F島的核電站,受9級特大地震影響雨饺,放射性物質(zhì)發(fā)生泄漏钳垮。R本人自食惡果不足惜惑淳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一额港、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧歧焦,春花似錦移斩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至舰涌,卻和暖如春猖任,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瓷耙。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工朱躺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人搁痛。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓长搀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鸡典。 傳聞我的和親對象是個殘疾皇子源请,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評論 2 361

推薦閱讀更多精彩內(nèi)容