Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android基礎入門教程——10.10 傳感器專題(1)——相關介紹

Android基礎入門教程——10.10 傳感器專題(1)——相關介紹

編輯:關於Android編程

Android基礎入門教程——10.10 傳感器專題(1)——相關介紹

標簽(空格分隔): Android基礎入門教程


1.傳感器相關介紹:

  說到傳感器,相信大家都不會陌生吧,比如微信的搖一搖就用到了加速度傳感器;
傳感器的定義:一種物理設備或者生物器官,能夠探測、感受外界的信號,物理條件(如光,熱,
適度)或化學組成(如煙霧),並將探知的信息傳遞給其他的設備或者器官!
傳感器的種類:可以從不同的角度對傳感器進行劃分,轉換原理(傳感器工作的基本物理或化學
效應);用途;輸出信號以及制作材料和工藝等。一般是按工作原來來分:物理傳感器與化學傳感器
兩類!手機上搭載的基本都是物理傳感器,手機上搭載的傳感器有下面這些:

方向傳感器(Orientation sensor) 加速感應器(Accelerometer sensor) 陀螺儀傳感器(Gyroscope sensor) 磁場傳感器(Magnetic field sensor) 距離傳感器(Proximity sensor) 光線傳感器(Light sensor) 氣壓傳感器(Pressure sensor) 溫度傳感器(Temperature sensor) 重力感應器(Gravity sensor,Android 2.3引入) 線性加速感應器(Linear acceleration sensor ,Android 2.3引入) 旋轉矢量傳感器(Rotation vector sensor,Android 2.3) 相對濕度傳感器(Relative humidity sensor,Android 4.0) 近場通信(NFC)傳感器(Android 2.3引入),NFC和其他不一樣,具有讀寫功能。

當然除了這些以外還有其他比如心率傳感器,記步傳感器,指紋傳感器等,
關於Android設備所支持的傳感器類型可見官方文檔:Sensor Summary部分的內容~


2.如何查看自己手機所支持的傳感器有哪些?

上面說的這麼多種肯定不是所有手機都具備的,每台手機上搭載的傳感器類型
以及數目都可能是不一樣的,比如我手頭上的Nexus 5支持的傳感器類型有:
重力,光線,距離,氣壓和陀螺儀!而令意外moto x 二代則有重力,光線,
距離和紅外傳感器!關於自己手機支持的傳感器類型,你可以到相關的評測
網站比如:中關村手機在線,太平洋等,搜索到自己的機型查看相關參數!
當然,我們也可以自己寫代碼來看看自己手機支持的傳感器類型~

代碼示例

運行效果圖

title=

代碼實現

activity_main.xml


    
        
    

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private TextView txt_show;
    private SensorManager sm;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        txt_show = (TextView) findViewById(R.id.txt_show);

        List allSensors = sm.getSensorList(Sensor.TYPE_ALL);
        StringBuilder sb = new StringBuilder();

        sb.append(此手機有 + allSensors.size() + 個傳感器,分別有:

);
        for(Sensor s:allSensors){
            switch (s.getType()){
                case Sensor.TYPE_ACCELEROMETER:
                    sb.append(s.getType() +  加速度傳感器(Accelerometer sensor) + 
);
                    break;
                case Sensor.TYPE_GYROSCOPE:
                    sb.append(s.getType() +  陀螺儀傳感器(Gyroscope sensor) + 
);
                    break;
                case Sensor.TYPE_LIGHT:
                    sb.append(s.getType() +  光線傳感器(Light sensor) + 
);
                    break;
                case Sensor.TYPE_MAGNETIC_FIELD:
                    sb.append(s.getType() +  磁場傳感器(Magnetic field sensor) + 
);
                    break;
                case Sensor.TYPE_ORIENTATION:
                    sb.append(s.getType() +  方向傳感器(Orientation sensor) + 
);
                    break;
                case Sensor.TYPE_PRESSURE:
                    sb.append(s.getType() +  氣壓傳感器(Pressure sensor) + 
);
                    break;
                case Sensor.TYPE_PROXIMITY:
                    sb.append(s.getType() +  距離傳感器(Proximity sensor) + 
);
                    break;
                case Sensor.TYPE_TEMPERATURE:
                    sb.append(s.getType() +  溫度傳感器(Temperature sensor) + 
);
                    break;
                default:
                    sb.append(s.getType() +  其他傳感器 + 
);
                    break;
            }
            sb.append(設備名稱: + s.getName() + 
 設備版本: + s.getVersion() + 
 供應商:
                    + s.getVendor() + 

);
        }
        txt_show.setText(sb.toString());
    }
}

3.Sensor傳感器相關的方法以及使用套路

從2中的例子我們可以大概地總結下獲取Sensor傳感器以及獲取傳感器相關的一些信息
流程如下:

1)Sensor傳感器的相關方法


Step 1:獲得傳感器管理器

SensorManager sm = (SensorManager)getSystemService(SENSOR_SERVICE); 
Step 2:獲得設備的傳感器對象的列表
List allSensors = sm.getSensorList(Sensor.TYPE_ALL);
Step 3:迭代獲取Sensor對象,然後調用對應方法獲得傳感器的相關信息:
for(Sensor s:allSensors){
    sensor.getName();   //獲得傳感器名稱
    sensor.getType();     //獲得傳感器種類
    sensor.getVendor();    //獲得傳感器供應商
    sensor.getVersion();    //獲得傳感器版本
    sensor.getResolution();  //獲得精度值
    sensor.getMaximumRange(); //獲得最大范圍
    sensor.getPower();        //傳感器使用時的耗電量 
}

2)傳感器的使用套路

一般我們是很少說直接去獲取Sensor,然後獲取上面這些信息的!因為這沒什麼
大的作用,我們更多的時候是去獲取傳感器采集到的數據,比如獲取當前的大氣壓,
或者方向傳感器三個角的值,或者陀螺儀的值這樣~而大部分的傳感器數據采集都是
下面的一個套路:

~Step 1:獲得傳感器管理器:

SensorManager sm = (SensorManager)getSystemService(SENSOR_SERVICE); 

~Step 2:調用特定方法獲得需要的傳感器:

比如這裡獲取的是方向傳感器,想獲得什麼傳感器自己查API~:

Sensor mSensorOrientation = sm.getDefaultSensor(Sensor.TYPE_ORIENTATION);

~Step 3:實現SensorEventListener接口,重寫onSensorChanged和onAccuracyChanged的方法!

onSensorChanged:當傳感器的值變化時會回調
onAccuracyChanged:當傳感器的進度發生改變時會回調

@Override
    public void onSensorChanged(SensorEvent event) {
        final float[] _Data = event.values;
       this.mService.onSensorChanged(_Data[0],_Data[1],_Data[2]);
    }
    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }

我們一般獲取傳感器數據的來源就是這個SensorEvent,這個類中有一個values的變量
類型是Float[],該變量最多有只有三個元素,而且傳感器不同,對應元素代表的含義也不同,
比如方向傳感器中第一個元素是方位角的值,而氣壓傳感器中第一個值則是氣壓值!

~Step 4:SensorManager對象調用registerListener注冊監聽器:

ms.registerListener(mContext, mSensorOrientation, android.hardware.SensorManager.SENSOR_DELAY_UI);

方法也很簡單,對應的參數:上下文對象Sensor傳感器對象
以及傳感器的延時時間的精度密度,有四個可選值:
SENSOR_DELAY_FASTEST——延時:0ms
SENSOR_DELAY_GAME——延時:20ms
SENSOR_DELAY_UI——延時:60ms
SENSOR_DELAY_NORMAL——延時:200ms
當然低延時意味著更頻繁的檢車,更意味著更多的電量消耗,如果不是要求精度非常高的建議
別使用太高精度的,一般用第三個較多~自己衡量衡量吧~

~Step 5:監聽器的取消注冊:

用完就放,一個很好的習慣,一般我們可以把他寫到Activity或者Service的銷毀方法中:

    public void destroy(){
        ms.unregisterListener(mContext, mSensorOrientation);
    }

好的,套路非常簡單~


 

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