Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 傳感器 (詳解二)—— 常用傳感器

Android 傳感器 (詳解二)—— 常用傳感器

編輯:關於Android編程

 

方向傳感器 Orientation (現在幾乎已經不用了,因為其實不存在真正的方向) 磁場傳感器 Magnetic Field 溫度傳感器 Temperature 光傳感器 Light 壓力傳感器 Pressure

1.方向傳感器 Orientation:

用途:
方向傳感器用於感應手機設備的擺放狀態。比如手機頂部的朝向,手機目前的傾斜角度等:借助於方向傳感器,可以開發指南針、水平儀。(注:現在我們一般不用方向傳感器來做指南針)

方向傳感器返回的三個角度說明:

第一個:表示手機頂部朝向與正北方的夾角。(比如手機繞Z軸旋轉時,該角度發生變化) 第二個:表示手機頂部或底部翹起的角度(比如手機繞X軸傾斜時,該角度值變化-180~180,手機頂部抬起變負值) 第三個:表示表示手機左側或右側翹起的角度(當手機繞Y軸傾斜時,該角度值發生變化范圍-90~90,左側抬起變負值)

2.磁場傳感器 Magnetic Field:

用途:
用於讀取手機設備外部的磁場強度。隨著手機設備擺放狀態的改變,周圍磁場在手機的X,Y,Z三個方向上的影響會發生改變。
磁場傳感器會返回三個數據: 分別代表周圍磁場分解到X,Y,Z三個方向上的磁場分量。

這裡就不詳細介紹了,後面我們用指南針的實例一起來介紹磁場傳感器的使用吧。

3.溫度傳感器 Temperature :

用途:
溫度傳感器用於獲得手機設備所處環境的溫度。
溫度傳感器會返回一個數據,該數據代表手機設備周圍的溫度,單位是攝氏度。

4.光傳感器 Light:

用途:
用於獲得手機設備所處環境的光的強度。
返回一個數據,代表手機設備周圍的光的強度,該數據單位是勒克斯(lux)

5.壓力傳感器 Pressure:

用途:
用於獲取手機設備所處環境的壓力的大小。
返回一個數據,代表手機設備周圍的壓力的大小。

實例:

功能:這裡利用幾個文本框來顯示不同的傳感器的值。

sensorAcitivity:

package com.example.myapplication.activitys;

import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;

import com.example.myapplication.R;
import com.example.myapplication.baseactivity.BaseActivity;

public class SensorActivity extends BaseActivity implements SensorEventListener{//2.必須實現接口
    private TextView mTextviewOri;
    private TextView mTextviewlight;
    private TextView mTextviewcichang;
    private TextView mTextviewtemp;
    private TextView mTextviewpressure;
    private SensorManager mSensorManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sensor);
        mTextviewOri = (TextView) findViewById(R.id.textori);
        mTextviewlight = (TextView) findViewById(R.id.textlight);
        mTextviewcichang = (TextView) findViewById(R.id.textcichang);
        mTextviewtemp = (TextView) findViewById(R.id.texttemper);
        mTextviewpressure = (TextView) findViewById(R.id.textpressure);

        //1.獲得傳感器管理服務
        mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);



    }

    @Override
    protected void onResume() {
        super.onResume();
        //3.為系統的方向傳感器注冊監聽器
        mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_GAME);
        //.為系統的磁場傳感器注冊監聽器
        mSensorManager.registerListener(this,mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),SensorManager.SENSOR_DELAY_GAME);
        //.為系統的溫度傳感器注冊監聽器
        mSensorManager.registerListener(this,mSensorManager.getDefaultSensor(Sensor.TYPE_AMBIENT_TEMPERATURE),SensorManager.SENSOR_DELAY_GAME);
        //.為系統的光傳感器注冊監聽器
        mSensorManager.registerListener(this,mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT),SensorManager.SENSOR_DELAY_GAME);
        //.為系統的壓力傳感器注冊監聽器
        mSensorManager.registerListener(this,mSensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE),SensorManager.SENSOR_DELAY_GAME);
    }

    /**
     * 下面兩個方法是實現接口不許實現的方法
     * @param event
     */
    @Override
    public void onSensorChanged(SensorEvent event) {//4.獲得數據進行操作
        float[] values = event.values;
        int sensorType = event.sensor.getType();//獲取觸發event的傳感器類型
        StringBuilder sb = null;
        //判斷是哪個傳感器發生改變
        switch (sensorType){
            //方向傳感器
            case Sensor.TYPE_ORIENTATION:
                sb = new StringBuilder();
                sb.append(繞z軸轉過的角度:);
                sb.append(values[0]);
                sb.append(
繞x軸轉過的角度:);
                sb.append(values[1]);
                sb.append(
繞y軸轉過的角度:);
                sb.append(values[2]);
                mTextviewOri.setText(sb.toString());
                break;
            //磁場傳感器
            case Sensor.TYPE_MAGNETIC_FIELD:
                sb = new StringBuilder();
                sb.append(x方向上的角度:);
                sb.append(values[0]);
                sb.append(
y方向上的角度:);
                sb.append(values[1]);
                sb.append(
z方向上的角度:);
                sb.append(values[2]);
                mTextviewcichang.setText(sb.toString());
                break;
            //溫度傳感器
            case Sensor.TYPE_AMBIENT_TEMPERATURE:
                sb = new StringBuilder();
                sb.append(當前溫度:);
                sb.append(values[0]);
                mTextviewtemp.setText(sb.toString());
                break;
            //光傳感器
            case Sensor.TYPE_LIGHT:
                sb = new StringBuilder();
                sb.append(當前光強度:);
                sb.append(values[0]);
                mTextviewlight.setText(sb.toString());
                break;
            //壓力傳感器
            case Sensor.TYPE_PRESSURE:
                sb = new StringBuilder();
                sb.append(當前壓力:);
                sb.append(values[0]);
                mTextviewpressure.setText(sb.toString());
                break;
        }


    }

    @Override //傳感器精度改變時回調的方法
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }

    @Override
    protected void onPause() {

        //程序暫停時取消注冊傳感器監聽器
        mSensorManager.unregisterListener(this);
        super.onPause();

    }

    @Override
    protected void onStop() {
        //程序停止時取消傳感器監聽器
        mSensorManager.unregisterListener(this);
        super.onStop();

    }
}

布局:






    
    
    
    
    
    
    
    
    
    


效果:
這裡寫圖片描述

這裡寫圖片描述

說明:
實際上,上面的數據模擬時都是變化的,但手機其實是沒有動位置的,所以我還不知道是哪裡的問題呢,望知道的大神指教。^^
還有,可以看出,該程序不能獲取傳感器和壓力傳感器的值,這是因為我的手機並不支持溫度傳感器和壓力傳感器的讀取。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved