欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
深入探討 Android 傳感器

 

簡(jiǎn)介: Android 是一個(gè)面向應用程序開(kāi)發(fā)的富平臺,它擁有許多具有吸引力的用戶(hù)界面元素和數據管理功能。Android 還提供了一組豐富的接口選項。在本文中,學(xué)習如何配合使用 Android 的各種傳感器選項監控您的環(huán)境。樣例代碼展示了如何在 Android 電話(huà)中錄制音頻。想構建自己的嬰兒監視器嗎?想用聲音來(lái)接聽(tīng)電話(huà)或者打開(kāi)房門(mén)嗎?請學(xué)習如何利用配備有 Android 的設備的硬件功能。


簡(jiǎn)介

對于 Java? 開(kāi)發(fā)人員來(lái)說(shuō),Android 平臺是通過(guò)使用硬件傳感器創(chuàng )建創(chuàng )新應用程序的理想平臺。我們將學(xué)習一些可用于 Android 應用程序的接口連接選項,包括使用傳感器子系統和錄制音頻片段。

利用配備 Android 的設備的硬件功能可以構建哪些應用程序呢?任何需要電子監視和監聽(tīng)的應用程序都可以構建。嬰兒監視器、安全系統,甚至地震儀都可以。理論上講,您不能同時(shí)出現在兩個(gè)地方,但 Android 可以利用一些可行的方法實(shí)現這一點(diǎn)??v觀(guān)本文始末,您必須記住,使用的 Android 設備不僅僅局限于 “手機”,還可以是部署在固定位置、具有無(wú)線(xiàn)網(wǎng)絡(luò )連接的設備,比如 EDGE 或 WiFi。下載 本文示例的源文件。


Android 傳感器功能

使用 Android 平臺有一個(gè)很新穎的地方,那就是您可以在設備內部訪(fǎng)問(wèn)一些 “好工具”。過(guò)去,訪(fǎng)問(wèn)設備底層硬件的能力一度讓移動(dòng)開(kāi)發(fā)人員感到非常棘手。盡管 Android Java 環(huán)境的角色仍然是您和設備的橋梁,但 Android 開(kāi)發(fā)團隊讓許多硬件功能浮出了水面。該平臺是一個(gè)開(kāi)源平臺,因此您可以自由地編寫(xiě)代碼實(shí)現您的任務(wù)。

如果尚未安裝 Android,您可以 下載 Android SDK。您還可以 瀏覽 android.hardware 包的內容并參考本文的示例。android.media 包 包含了一些提供有用和新穎功能的類(lèi)。

Android SDK 中包含的一些面向硬件的功能描述如下。


表 1. Android SDK 中提供的面向硬件的特性
特性 描述
android.hardware.Camera 允許應用程序與相機交互的類(lèi),可以截取照片、獲取預覽屏幕的圖像,修改用來(lái)治理相機操作的參數。
android.hardware.SensorManager 允許訪(fǎng)問(wèn) Android 平臺傳感器的類(lèi)。并非所有配備 Android 的設備都支持 SensorManager 中的所有傳感器,雖然這種可能性讓人非常興奮。(可用傳感器的簡(jiǎn)介見(jiàn)下文)
android.hardware.SensorListener 在傳感器值實(shí)時(shí)更改時(shí),希望接收更新的類(lèi)要實(shí)現的接口。應用程序實(shí)現該接口來(lái)監視硬件中一個(gè)或多個(gè)可用傳感器。例如,本文中的 代碼 包含實(shí)現該接口的類(lèi),實(shí)現后可以監視設備的方向和內置的加速表。
android.media.MediaRecorder 用于錄制媒體樣例的類(lèi),對于錄制特定位置(比如嬰兒保育)的音頻活動(dòng)非常有用。還可以分析音頻片段以便在訪(fǎng)問(wèn)控件或安全應用程序時(shí)進(jìn)行身份鑒定。例如,它可以幫助您通過(guò)聲音打開(kāi)門(mén),以節省時(shí)間,不需要從房產(chǎn)經(jīng)紀人處獲取鑰匙。
android.FaceDetector 允許對人臉(以位圖形式包含)進(jìn)行基本識別的類(lèi)。不可能有兩張完全一樣的臉??梢允褂迷擃?lèi)作為設備鎖定方法,無(wú)需記密碼 — 這是手機的生物特征識別功能。
android.os.* 包含幾個(gè)有用類(lèi)的包,可以與操作環(huán)境交互,包括電源管理、文件查看器、處理器和消息類(lèi)。和許多可移動(dòng)設備一樣,支持 Android 的電話(huà)可能會(huì )消耗大量電能。讓設備在正確的時(shí)間 “醒來(lái)” 以監視感興趣的事件是在設計時(shí)需要首先關(guān)注的方面。
java.util.Date
java.util.Timer
java.util.TimerTask
當測量實(shí)際的事件時(shí),數據和時(shí)間往往很重要。例如,java.util.Date 類(lèi)允許您在遇到特定的事件或狀況時(shí)獲取時(shí)間戳。您可以使用 java.util.Timerjava.util.TimerTask 分別執行周期性任務(wù)或時(shí)間點(diǎn)任務(wù)。

android.hardware.SensorManager 包含幾個(gè)常量,這表示 Android 傳感器系統的不同方面,包括:

傳感器類(lèi)型
方向、加速表、光線(xiàn)、磁場(chǎng)、臨近性、溫度等。
采樣率
最快、游戲、普通、用戶(hù)界面。當應用程序請求特定的采樣率時(shí),其實(shí)只是對傳感器子系統的一個(gè)提示,或者一個(gè)建議。不保證特定的采樣率可用。
準確性
高、低、中、不可靠。

SensorListener 接口是傳感器應用程序的中心。它包括兩個(gè)必需方法:

  • onSensorChanged(int sensor,float values[]) 方法在傳感器值更改時(shí)調用。該方法只對受此應用程序監視的傳感器調用(更多內容見(jiàn)下文)。該方法的參數包括:一個(gè)整數,指示更改的傳感器;一個(gè)浮點(diǎn)值數組,表示傳感器數據本身。有些傳感器只提供一個(gè)數據值,另一些則提供三個(gè)浮點(diǎn)值。方向和加速表傳感器都提供三個(gè)數據值。
  • 當傳感器的準確性更改時(shí),將調用 onAccuracyChanged(int sensor,int accuracy) 方法。參數包括兩個(gè)整數:一個(gè)表示傳感器,另一個(gè)表示該傳感器新的準確值。

要與傳感器交互,應用程序必須注冊以偵聽(tīng)與一個(gè)或多個(gè)傳感器相關(guān)的活動(dòng)。注冊使用 SensorManager 類(lèi)的 registerListener 方法完成。本文中的 代碼示例 演示了如何注冊和注銷(xiāo) SensorListener。

記住,并非所有支持 Android 的設備都支持 SDK 中定義的所有傳感器。如果某個(gè)傳感器無(wú)法在特定的設備上使用,您的應用程序就會(huì )適當地降級。


傳感器示例

樣例應用程序僅監控對方向和加速表傳感器的更改(源代碼見(jiàn) 下載)。當收到更改時(shí),傳感器值在 TextView 小部件的屏幕上顯示。圖 1 展示了該應用程序的運行情況。


圖 1. 監視加速和方向


使用 Eclipse 環(huán)境和 Android Developer Tools 插件創(chuàng )建的應用程序。(關(guān)于使用 Eclipse 開(kāi)發(fā) Android 應用程序的信息,請參見(jiàn) 參考資料。)清單 1 展示了該應用程序的代碼。


清單 1. IBMEyes.java
            package com.msi.ibm.eyes;            import android.app.Activity;            import android.os.Bundle;            import android.util.Log;            import android.widget.TextView;            import android.hardware.SensorManager;            import android.hardware.SensorListener;            public class IBMEyes extends Activity implements SensorListener {            final String tag = "IBMEyes";            SensorManager sm = null;            TextView xViewA = null;            TextView yViewA = null;            TextView zViewA = null;            TextView xViewO = null;            TextView yViewO = null;            TextView zViewO = null;            /** Called when the activity is first created. */            @Override            public void onCreate(Bundle savedInstanceState) {            super.onCreate(savedInstanceState);            // get reference to SensorManager            sm = (SensorManager) getSystemService(SENSOR_SERVICE);            setContentView(R.layout.main);            xViewA = (TextView) findViewById(R.id.xbox);            yViewA = (TextView) findViewById(R.id.ybox);            zViewA = (TextView) findViewById(R.id.zbox);            xViewO = (TextView) findViewById(R.id.xboxo);            yViewO = (TextView) findViewById(R.id.yboxo);            zViewO = (TextView) findViewById(R.id.zboxo);            }            public void onSensorChanged(int sensor, float[] values) {            synchronized (this) {            Log.d(tag, "onSensorChanged: " + sensor + ", x: " +            values[0] + ", y: " + values[1] + ", z: " + values[2]);            if (sensor == SensorManager.SENSOR_ORIENTATION) {            xViewO.setText("Orientation X: " + values[0]);            yViewO.setText("Orientation Y: " + values[1]);            zViewO.setText("Orientation Z: " + values[2]);            }            if (sensor == SensorManager.SENSOR_ACCELEROMETER) {            xViewA.setText("Accel X: " + values[0]);            yViewA.setText("Accel Y: " + values[1]);            zViewA.setText("Accel Z: " + values[2]);            }            }            }            public void onAccuracyChanged(int sensor, int accuracy) {            Log.d(tag,"onAccuracyChanged: " + sensor + ", accuracy: " + accuracy);            }            @Override            protected void onResume() {            super.onResume();            // register this class as a listener for the orientation and accelerometer sensors            sm.registerListener(this,            SensorManager.SENSOR_ORIENTATION |SensorManager.SENSOR_ACCELEROMETER,            SensorManager.SENSOR_DELAY_NORMAL);            }            @Override            protected void onStop() {            // unregister listener            sm.unregisterListener(this);            super.onStop();            }            }            

編寫(xiě)應用程序必須基于常見(jiàn)的活動(dòng),因為它只是利用從傳感器獲取的數據更新屏幕。在設備可能在前臺執行其他活動(dòng)的應用程序中,將應用程序構建為服務(wù)可能更加合適。

該活動(dòng)的 onCreate 方法可以引用 SensorManager,其中包含所有與傳感器有關(guān)的函數。onCreate 方法還建立了對 6 個(gè) TextView 小部件的引用,您需要使用傳感器數據值更新這些小部件。

onResume() 方法使用對 SensorManager 的引用通過(guò) registerListener 方法注冊傳感器更新:

  • 第一個(gè)參數是實(shí)現 SensorListener 接口的類(lèi)的實(shí)例。
  • 第二個(gè)參數是所需傳感器的位掩碼。在本例中,應用程序從 SENSOR_ORIENTATIONSENSOR_ACCELEROMETER 請求數據。
  • 第三個(gè)參數是一個(gè)系統提示,指出應用程序更新傳感器值所需的速度。

應用程序(活動(dòng))暫停后,需要注銷(xiāo)偵聽(tīng)器,這樣以后就不會(huì )再收到傳感器更新。這通過(guò) SensorManagerunregisterListener 方法實(shí)現。惟一的參數是 SensorListener 的實(shí)例。

registerListenerunregisterListener 方法調用中,應用程序使用關(guān)鍵字 this。注意類(lèi)定義中的 implements 關(guān)鍵字,其中聲明了該類(lèi)實(shí)現 SensorListener 接口。這就是要將它傳遞到 registerListenerunregisterListener 的原因。

SensorListener 必須實(shí)現兩個(gè)方法 onSensorChangeonAccuracyChanged。示例應用程序不關(guān)心傳感器的準確度,但關(guān)注傳感器當前的 X、Y 和 Z 值。onAccuracyChanged 方法實(shí)質(zhì)上不執行任何操作;它只在每次調用時(shí)添加一個(gè)日志項。

似乎經(jīng)常需要調用 onSensorChanged 方法,因為加速表和方向傳感器正在快速發(fā)送數據。查看第一個(gè)參數確定哪個(gè)傳感器在發(fā)送數據。確認了發(fā)送數據的傳感器之后,將使用方法第二個(gè)參數傳遞的浮點(diǎn)值數組中所包含的數據更新相應的 UI 元素。該示例只是顯示這些值,但在更加高級的應用程序中,還可以分析這些值,比較原來(lái)的值,或者設置某種模式識別算法來(lái)確定用戶(hù)(或外部環(huán)境)的行為。

現在您已經(jīng)了解了傳感器子系統,接下來(lái)的部分將回顧一個(gè)在 Android 手機上錄制音頻的代碼樣例。該樣例運行在 DEV1 開(kāi)發(fā)設備上。


使用 MediaRecorder

android.media 包包含與媒體子系統交互的類(lèi)。使用 android.media.MediaRecorder 類(lèi)進(jìn)行媒體采樣,包括音頻和視頻。MediaRecorder 作為狀態(tài)機運行。您需要設置不同的參數,比如源設備和格式。設置后,可執行任何時(shí)間長(cháng)度的錄制,直到用戶(hù)停止。

清單 2 包含的代碼在 Android 設備上錄制音頻。顯示的代碼不包括應用程序的 UI 元素(完整源代碼見(jiàn) 下載)。


清單 2. 錄制音頻片段
            MediaRecorder mrec ;            File audiofile = null;            private static final String TAG="SoundRecordingDemo";            protected void startRecording() throws IOException            {            mrec.setAudioSource(MediaRecorder.AudioSource.MIC);            mrec.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);            mrec.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);            if (mSampleFile == null)            {            File sampleDir = Environment.getExternalStorageDirectory();            try            {            audiofile = File.createTempFile("ibm", ".3gp", sampleDir);            }            catch (IOException e)            {            Log.e(TAG,"sdcard access error");            return;            }            }            mrec.setOutputFile(audiofile.getAbsolutePath());            mrec.prepare();            mrec.start();            }            protected void stopRecording()            {            mrec.stop();            mrec.release();            processaudiofile(audiofile.getAbsolutePath());            }            protected void processaudiofile()            {            ContentValues values = new ContentValues(3);            long current = System.currentTimeMillis();            values.put(MediaStore.Audio.Media.TITLE, "audio" + audiofile.getName());            values.put(MediaStore.Audio.Media.DATE_ADDED, (int) (current / 1000));            values.put(MediaStore.Audio.Media.MIME_TYPE, "audio/3gpp");            values.put(MediaStore.Audio.Media.DATA, audiofile.getAbsolutePath());            ContentResolver contentResolver = getContentResolver();            Uri base = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;            Uri newUri = contentResolver.insert(base, values);            sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, newUri));            }            

startRecording 方法中,實(shí)例化并初始化 MediaRecorder 的實(shí)例:

  • 輸入源被設置為麥克風(fēng)(MIC)。
  • 輸出格式被設置為 3GPP(*.3gp 文件),這是移動(dòng)設備專(zhuān)用的媒體格式。
  • 編碼器被設置為 AMR_NB,這是音頻格式,采樣率為 8 KHz。NB 表示窄頻。SDK 文檔 解釋了不同的數據格式和可用的編碼器。

音頻文件存儲在存儲卡而不是內存中。External.getExternalStorageDirectory() 返回存儲卡位置的名稱(chēng),在該目錄中將創(chuàng )建一個(gè)臨時(shí)文件名。然后,通過(guò)調用 setOutputFile 方法將文件關(guān)聯(lián)到 MediaRecorder 實(shí)例。音頻數據將存儲到該文件中。

調用 prepare 方法完成 MediaRecorder 的初始化。準備開(kāi)始錄制流程時(shí),將調用 start 方法。在調用 stop 方法之前,將對存儲卡上的文件進(jìn)行錄制。release 方法將釋放分配給 MediaRecorder 實(shí)例的資源。

音頻采樣完成之后,需要采取以下步驟:

  • 向設備的媒體庫添加該音頻。
  • 執行一些模式識別步驟確定聲音:
    • 這是嬰兒的啼哭聲嗎?
    • 這是所有人的聲音嗎?是否要解鎖手機?
    • 這是 “芝麻開(kāi)門(mén)” 嗎?是否要打開(kāi)通往 “秘密通道” 的大門(mén)?
  • 自動(dòng)將音頻文件上傳到網(wǎng)絡(luò )位置以便處理。

在該代碼樣例中,processaudiofile 方法將音頻添加到媒體庫。使用 Intent 通知設備上的媒體應用程序有新內容可用。

關(guān)于該代碼片段最后要注意的是:如果您試用,它一開(kāi)始不會(huì )錄制音頻。您將看到創(chuàng )建的文件,但是沒(méi)有任何音頻。您需要向 AndroidManifest.xml 文件添加權限:

<uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>

現在,您已經(jīng)學(xué)了一點(diǎn)關(guān)于與 Android 傳感器和錄制音頻相關(guān)的內容。下一節將更全面的介紹與數據采集和報告系統有關(guān)的應用程序架構。


Android 作為傳感器平臺

Android 平臺包含各種用于監視環(huán)境的傳感器選項。有了輸入或模擬選項數組,以及高級計算和互聯(lián)功能,Android 成為構建實(shí)際系統的最佳平臺。圖 2 顯示了輸入、應用程序邏輯、通知方法或輸出之間的簡(jiǎn)單視圖。


圖 2. 以 Android 為中心的傳感器系統的方塊圖


該架構很靈活;應用程序邏輯可以劃分為本地 Android 設備和服務(wù)器端資源(可以實(shí)現更大的數據庫和計算功能)。例如,本地 Android 設備上錄制的音軌可以 POST 到 Web 服務(wù)器,其中將根據音頻模式數據庫比較數據。很明顯,這僅僅是冰山一角。希望您能更深入地研究,讓 Android 平臺超越移動(dòng)電話(huà)的范疇。

結束語(yǔ)

在本文中,我們介紹了 Android 傳感器。樣例應用程序度量了方向和加速,以及使用 MediaRecorder 類(lèi)與錄制功能進(jìn)行交互。對于構建實(shí)際系統,Android 是一個(gè)靈活、有吸引力的平臺。Android 領(lǐng)域發(fā)展迅速,并且不斷壯大。請務(wù)必關(guān)注該平臺。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Android之使用傳感器獲取相應數據
Sensor傳感器源碼的閱讀與應用開(kāi)發(fā)簡(jiǎn)單實(shí)例
Android 開(kāi)發(fā)
Android錄音與播放
深入理解Android Sensor系統 (4.0)
Android-使用mediarecorder類(lèi)獲取當前麥克風(fēng)音量值
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久