Android的傳感器開發(fā)

在Android系統(tǒng)中開發(fā)傳感器應(yīng)用十分簡單蜻底,因為Android系統(tǒng)為傳感器支持提供了強(qiáng)大的管理服務(wù),同樣傳感器的種類也有許多恰力。
簡單的開發(fā)步驟如下:

  • 1.調(diào)用Context的getSystemService(Context.SENSOR_SERVICE)方法獲取SensorManager對象狰右,即傳感器管理服務(wù)貌嫡。
  • 2.調(diào)用SensorManager的getDefaultSensor(int type)方法獲取指定的傳感器類型驾窟。
  • 3.通常選擇在Activity的o你Resume()方法中調(diào)用SensorManager的registerListener()方法注冊監(jiān)聽器庆猫,可獲取傳回的數(shù)據(jù)。

registerListener()方法的三個參數(shù)如下:

  • listener 監(jiān)聽傳感器的監(jiān)聽器纫普。
  • sensor 傳感器對象阅悍。
  • rate 獲取的傳感器數(shù)據(jù)頻率好渠。

其中的rate值有四種形式分別是:

  • SensorManager.SENSOR_DELAY_FASTEST:頻率最快昨稼,延遲最小节视,但手機(jī)耗電量大,資源消耗較多假栓。
  • SensorManager.SENSOR_DELAY_GAME:適合游戲開發(fā)的頻率寻行。
  • SensorManager.SENSOR_DELAY_NORMAL:正常頻率,對及時性要求不高的適合使用這種匾荆。
  • SensorManager.SENSOR_DELAY_UI:適合普通用戶界面的頻率拌蜘,這種模式比較省電,內(nèi)存消耗不大牙丽,不過延遲較大简卧。

Android中常用的傳感器有:方向傳感器,陀螺儀傳感器烤芦,磁場傳感器举娩,重力傳感器,線性加速度傳感器构罗,溫度傳感器铜涉,光傳感器,壓力傳感器遂唧。
下面是代碼介紹了所有傳感器的使用:

import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;

public class MainActivity extends Activity
        implements SensorEventListener
{
    // 定義Sensor管理器
    private SensorManager mSensorManager;
    EditText etOrientation;
    EditText etGyro;
    EditText etMagnetic;
    EditText etGravity;
    EditText etLinearAcc;
    EditText etTemerature;
    EditText etLight;
    EditText etPressure;
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // 獲取界面上的EditText組件
        etOrientation = (EditText) findViewById(R.id.etOrientation);
        etGyro = (EditText) findViewById(R.id.etGyro);
        etMagnetic = (EditText) findViewById(R.id.etMagnetic);
        etGravity = (EditText) findViewById(R.id.etGravity);
        etLinearAcc = (EditText) findViewById(R.id.etLinearAcc);
        etTemerature = (EditText) findViewById(R.id.etTemerature);
        etLight = (EditText) findViewById(R.id.etLight);
        etPressure = (EditText) findViewById(R.id.etPressure);
        // 獲取傳感器管理服務(wù)
        mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);  // ①
    }
    @Override
    protected void onResume()
    {
        super.onResume();
        // 為系統(tǒng)的方向傳感器注冊監(jiān)聽器
        mSensorManager.registerListener(this,
                mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
                SensorManager.SENSOR_DELAY_GAME);
        // 為系統(tǒng)的陀螺儀傳感器注冊監(jiān)聽器
        mSensorManager.registerListener(this,
                mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE),
                SensorManager.SENSOR_DELAY_GAME);
        // 為系統(tǒng)的磁場傳感器注冊監(jiān)聽器
        mSensorManager.registerListener(this,
                mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
                SensorManager.SENSOR_DELAY_GAME);
        // 為系統(tǒng)的重力傳感器注冊監(jiān)聽器
        mSensorManager.registerListener(this,
                mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY),
                SensorManager.SENSOR_DELAY_GAME);
        // 為系統(tǒng)的線性加速度傳感器注冊監(jiān)聽器
        mSensorManager.registerListener(this,
                mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION),
                SensorManager.SENSOR_DELAY_GAME);
        // 為系統(tǒng)的溫度傳感器注冊監(jiān)聽器
        mSensorManager.registerListener(this,
                mSensorManager.getDefaultSensor(Sensor.TYPE_AMBIENT_TEMPERATURE),
                SensorManager.SENSOR_DELAY_GAME);
        // 為系統(tǒng)的光傳感器注冊監(jiān)聽器
        mSensorManager.registerListener(this,
                mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT),
                SensorManager.SENSOR_DELAY_GAME);
        // 為系統(tǒng)的壓力傳感器注冊監(jiān)聽器
        mSensorManager.registerListener(this,
                mSensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE),
                SensorManager.SENSOR_DELAY_GAME);
    }
    @Override
    protected void onStop()
    {
        // 程序退出時取消注冊傳感器監(jiān)聽器
        mSensorManager.unregisterListener(this);
        super.onStop();
    }
    @Override
    protected void onPause()
    {
        // 程序暫停時取消注冊傳感器監(jiān)聽器
        mSensorManager.unregisterListener(this);
        super.onPause();
    }
    // 以下是實現(xiàn)SensorEventListener接口必須實現(xiàn)的方法
    @Override
    // 當(dāng)傳感器精度改變時回調(diào)該方法芙代。
    public void onAccuracyChanged(Sensor sensor, int accuracy)
    {
    }
    @Override
    public void onSensorChanged(SensorEvent event)
    {
        float[] values = event.values;
        // 獲取觸發(fā)event的傳感器類型
        int sensorType = event.sensor.getType();
        StringBuilder sb = null;
        // 判斷是哪個傳感器發(fā)生改變
        switch (sensorType)
        {
            // 方向傳感器
            case Sensor.TYPE_ORIENTATION:
                sb = new StringBuilder();
                sb.append("繞Z軸轉(zhuǎn)過的角度:");
                sb.append(values[0]);
                sb.append("\n繞X軸轉(zhuǎn)過的角度:");
                sb.append(values[1]);
                sb.append("\n繞Y軸轉(zhuǎn)過的角度:");
                sb.append(values[2]);
                etOrientation.setText(sb.toString());
                break;
            // 陀螺儀傳感器
            case Sensor.TYPE_GYROSCOPE:
                sb = new StringBuilder();
                sb.append("繞X軸旋轉(zhuǎn)的角速度:");
                sb.append(values[0]);
                sb.append("\n繞Y軸旋轉(zhuǎn)的角速度:");
                sb.append(values[1]);
                sb.append("\n繞Z軸旋轉(zhuǎn)的角速度:");
                sb.append(values[2]);
                etGyro.setText(sb.toString());
                break;
            // 磁場傳感器
            case Sensor.TYPE_MAGNETIC_FIELD:
                sb = new StringBuilder();
                sb.append("X軸方向上的磁場強(qiáng)度:");
                sb.append(values[0]);
                sb.append("\nY軸方向上的磁場強(qiáng)度:");
                sb.append(values[1]);
                sb.append("\nZ軸方向上的磁場強(qiáng)度:");
                sb.append(values[2]);
                etMagnetic.setText(sb.toString());
                break;
            // 重力傳感器
            case Sensor.TYPE_GRAVITY:
                sb = new StringBuilder();
                sb.append("X軸方向上的重力:");
                sb.append(values[0]);
                sb.append("\nY軸方向上的重力:");
                sb.append(values[1]);
                sb.append("\nZ方向上的重力:");
                sb.append(values[2]);
                etGravity.setText(sb.toString());
                break;
            // 線性加速度傳感器
            case Sensor.TYPE_LINEAR_ACCELERATION:
                sb = new StringBuilder();
                sb.append("X軸方向上的線性加速度:");
                sb.append(values[0]);
                sb.append("\nY軸方向上的線性加速度:");
                sb.append(values[1]);
                sb.append("\nZ軸方向上的線性加速度:");
                sb.append(values[2]);
                etLinearAcc.setText(sb.toString());
                break;
            // 溫度傳感器
            case Sensor.TYPE_AMBIENT_TEMPERATURE:
                sb = new StringBuilder();
                sb.append("當(dāng)前溫度為:");
                sb.append(values[0]);
                etTemerature.setText(sb.toString());
                break;
            // 光傳感器
            case Sensor.TYPE_LIGHT:
                sb = new StringBuilder();
                sb.append("當(dāng)前光的強(qiáng)度為:");
                sb.append(values[0]);
                etLight.setText(sb.toString());
                break;
            // 壓力傳感器
            case Sensor.TYPE_PRESSURE:
                sb = new StringBuilder();
                sb.append("當(dāng)前壓力為:");
                sb.append(values[0]);
                etPressure.setText(sb.toString());
                break;
        }
    }
}

總結(jié)
在手機(jī)屏幕中傳感器所指定的X,Y,Z軸是以手機(jī)屏幕中心為圓心的,并不是View視圖內(nèi)的左上角盖彭!
onSensorChanged():當(dāng)傳感器的值發(fā)生改變時觸發(fā)纹烹。
onAccuracyChanged():當(dāng)傳感器的精度發(fā)生改變時觸發(fā)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末召边,一起剝皮案震驚了整個濱河市铺呵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掌实,老刑警劉巖陪蜻,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異贱鼻,居然都是意外死亡宴卖,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進(jìn)店門邻悬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來症昏,“玉大人,你說我怎么就攤上這事父丰「翁罚” “怎么了掘宪?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長攘烛。 經(jīng)常有香客問我魏滚,道長,這世上最難降的妖魔是什么坟漱? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任鼠次,我火速辦了婚禮,結(jié)果婚禮上芋齿,老公的妹妹穿的比我還像新娘腥寇。我一直安慰自己,他們只是感情好觅捆,可當(dāng)我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布赦役。 她就那樣靜靜地躺著,像睡著了一般栅炒。 火紅的嫁衣襯著肌膚如雪掂摔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天职辅,我揣著相機(jī)與錄音棒呛,去河邊找鬼。 笑死域携,一個胖子當(dāng)著我的面吹牛簇秒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播秀鞭,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼趋观,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了锋边?” 一聲冷哼從身側(cè)響起皱坛,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎豆巨,沒想到半個月后剩辟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡往扔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年贩猎,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片萍膛。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡吭服,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蝗罗,到底是詐尸還是另有隱情艇棕,我是刑警寧澤蝌戒,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站沼琉,受9級特大地震影響北苟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜刺桃,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一粹淋、第九天 我趴在偏房一處隱蔽的房頂上張望吸祟。 院中可真熱鬧瑟慈,春花似錦、人聲如沸屋匕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽过吻。三九已至进泼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間纤虽,已是汗流浹背乳绕。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留逼纸,地道東北人洋措。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像杰刽,于是被迫代替她去往敵國和親菠发。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,055評論 2 355

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