對(duì)Android傳感器系統(tǒng)全解析
Android 是一個(gè)靈活、有吸引力的平臺(tái),Google的Android 領(lǐng)域發(fā)展迅速,并且越來(lái)越發(fā)展的強(qiáng)大,下面的文章進(jìn)行全面的介紹Android傳感器和報(bào)告系統(tǒng)有關(guān)的應(yīng)用程序架構(gòu)。
應(yīng)用程序(活動(dòng))暫停后,需要注銷偵聽(tīng)器,這樣以后就不會(huì)再收到傳感器更新。這通過(guò) SensorManager 的 unregisterListener 方法實(shí)現(xiàn)。惟一的參數(shù)是 SensorListener 的實(shí)例。在 registerListener 和 unregisterListener 方法調(diào)用中,應(yīng)用程序使用關(guān)鍵字 this。注意類定義中的 implements 關(guān)鍵字。
其中聲明了該類實(shí)現(xiàn) SensorListener 接口。這就是要將它傳遞到 registerListener 和 unregisterListener 的原因。SensorListener 必須實(shí)現(xiàn)兩個(gè)方法 onSensorChange 和onAccuracyChanged。示例應(yīng)用程序不關(guān)心傳感器的準(zhǔn)確度。
但關(guān)注傳感器當(dāng)前的 X、Y 和 Z 值。onAccuracyChanged 方法實(shí)質(zhì)上不執(zhí)行任何操作;它只在每次調(diào)用時(shí)添加一個(gè)日志項(xiàng)。似乎經(jīng)常需要調(diào)用 onSensorChanged 方法,因?yàn)榧铀俦砗头较騻鞲衅髡诳焖侔l(fā)送數(shù)據(jù)。查看***個(gè)參數(shù)確定哪個(gè)傳感器在發(fā)送數(shù)據(jù)。
確認(rèn)了發(fā)送數(shù)據(jù)的傳感器之后,將使用方法第二個(gè)參數(shù)傳遞的浮點(diǎn)值數(shù)組中所包含的數(shù)據(jù)更新相應(yīng)的 UI 元素。該示例只是顯示這些值,但在更加高級(jí)的應(yīng)用程序中,還可以分析這些值,比較原來(lái)的值,或者設(shè)置某種模式識(shí)別算法來(lái)確定用戶(或外部環(huán)境)的行為。
現(xiàn)在您已經(jīng)了解了傳感器子系統(tǒng),接下來(lái)的部分將回顧一個(gè)在Android傳感器上錄制音頻的代碼樣例。該樣例運(yùn)行在 DEV1 開(kāi)發(fā)設(shè)備上。android.media 包包含與媒體子系統(tǒng)交互的類。使用 android.media.MediaRecorder 類進(jìn)行媒體采樣,包括音頻和視頻。MediaRecorder 作為狀態(tài)機(jī)運(yùn)行。
您需要設(shè)置不同的參數(shù),比如源設(shè)備和格式。設(shè)置后,可執(zhí)行任何時(shí)間長(zhǎng)度的錄制,直到用戶停止。清單 2 包含的代碼在 Android 設(shè)備上錄制音頻。顯示的代碼不包括應(yīng)用程序的 UI 元素(完整源代碼見(jiàn) 下載)。在 startRecording 方法中,實(shí)例化并初始化 MediaRecorder 的實(shí)例:
輸入源被設(shè)置為麥克風(fēng)(MIC)。輸出格式被設(shè)置為 3GPP(*.3gp 文件),這是移動(dòng)設(shè)備專用的媒體格式。編碼器被設(shè)置為 AMR_NB,這是音頻格式,采樣率為 8 KHz。NB 表示窄頻。SDK 文檔 解釋了不同的數(shù)據(jù)格式和可用的編碼器。
音頻文件存儲(chǔ)在存儲(chǔ)卡而不是內(nèi)存中。External.getExternalStorageDirectory() 返回存儲(chǔ)卡位置的名稱,在該目錄中將創(chuàng)建一個(gè)臨時(shí)文件名。然后,通過(guò)調(diào)用 setOutputFile 方法將文件關(guān)聯(lián)到 MediaRecorder 實(shí)例。音頻數(shù)據(jù)將存儲(chǔ)到該文件中。調(diào)用 prepare 方法完成 MediaRecorder 的初始化。
準(zhǔn)備開(kāi)始錄制流程時(shí),將調(diào)用 start 方法。在調(diào)用 stop 方法之前,將對(duì)存儲(chǔ)卡上的文件進(jìn)行錄制。release 方法將釋放分配給 MediaRecorder 實(shí)例的資源。在該代碼樣例中,processaudiofile 方法將音頻添加到媒體庫(kù)。使用 Intent 通知設(shè)備上的媒體應(yīng)用程序有新內(nèi)容可用。
關(guān)于該代碼片段***要注意的是:如果您試用,它一開(kāi)始不會(huì)錄制音頻。您將看到創(chuàng)建的文件,但是沒(méi)有任何音頻。您需要向 AndroidManifest.xml 文件添加權(quán)限?,F(xiàn)在,您已經(jīng)學(xué)了一點(diǎn)關(guān)于與 Android 傳感器和錄制音頻相關(guān)的內(nèi)容。下一節(jié)將更全面的介紹與數(shù)據(jù)采集和報(bào)告系統(tǒng)有關(guān)的應(yīng)用程序架構(gòu)。
該架構(gòu)很靈活;應(yīng)用程序邏輯可以劃分為本地 Android 設(shè)備和服務(wù)器端資源(可以實(shí)現(xiàn)更大的數(shù)據(jù)庫(kù)和計(jì)算功能)。例如,本地 Android 設(shè)備上錄制的音軌可以 POST 到 Web 服務(wù)器,其中將根據(jù)音頻模式數(shù)據(jù)庫(kù)比較數(shù)據(jù)。很明顯,這僅僅是冰山一角。希望您能更深入地研究,讓 Android 平臺(tái)超越移動(dòng)電話的范疇。
該架構(gòu)很靈活;應(yīng)用程序邏輯可以劃分為本地 Android 設(shè)備和服務(wù)器端資源(可以實(shí)現(xiàn)更大的數(shù)據(jù)庫(kù)和計(jì)算功能)。例如,本地 Android 設(shè)備上錄制的音軌可以 POST 到 Web 服務(wù)器,其中將根據(jù)音頻模式數(shù)據(jù)庫(kù)比較數(shù)據(jù)。很明顯,這僅僅是冰山一角。希望您能更深入地研究,讓Android傳感器超越移動(dòng)電話的范疇。
【編輯推薦】