標籤:android開發 感應器
隨著手機的發展,現在各大手機支援的感應器類型也越來越多,在開發中利用感應器進行某些操作令人們有一種耳目一新的感覺,例如中的搖一搖,以及手機音樂播放器中的搖一搖切歌。今天來簡單介紹下Android中感應器的使用以及一些常用的感應器。
一、感應器的使用
1.首先我們需要獲得感應器管理對象:通過 mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
2.為SensorManager對象添加監聽事件,通過SensorManage的registerListener方法可以為我們的感應器添加監聽事件,該方法有多種重載形式,一般我們必須要提供一個listener對象並實現SensorEventListener介面,然後是感應器的類型(int類型值),或一個感應器Sensor對象(通過getDefaultSensor可以得到一個sensor對象)。
在SensorEventListener介面中有兩個重要的方法,
1)public void onAccuracyChanged(Sensor sensor, int degree),當感應器的精準度發生改變時被調用,degree為新的感應器精度。
2)public void onSensorChanged(SensorEvent event),感應器資訊改變時執行該方法,其中event對象中的values成員中包含了我們所需要的感應器的重要訊息,這是一個float數組值,一般根據感應器類型不同,該值也會不同,下面我會來介紹一下一些常用的感應器類型的values值得含義。一般我們在該方法中根據所獲得的感應器資訊來處理自己的事情。
3.當我們不需要監聽感應器時,通過一個unregisterListener方法來銷毀註冊。
二、常用感應器類型介紹
在前面我們已經知道SensorEvent中的values是一個擷取感應器資訊的重要變數,接下來就來介紹一些常用感應器的values含義。
沿手機螢幕橫向為x軸,向右為正;沿手機螢幕豎向為y軸,向上為正;垂直手機螢幕方向為z軸,向外為正。
1.Sensor.TYPE_ACCELEROMETER:加速度感應感應器
values[0]:x軸方向的重力加速度。
values[1]:y軸方向的重力加速度。
values[2]:z軸方向的重力加速度。
2.Sensor.TYPE_GYROSCOPE: 陀螺儀感應器
values[0]:沿x軸旋轉的角速度。
values[1]:沿y軸旋轉的角速度。
values[2]:沿z軸旋轉的角速度。
3.Sensor.TYPE_ORIENTATION:方向感應器
旋轉向量代表裝置的結合的方向角和軸的裝置通過一個角θ繞軸旋轉< x,y,z >。
values[0]:手機繞著z軸旋轉的角度。0表示北(North);90表示東(East);180表示南(South);270表示西(West)。如果手機是水平放置,表示手機的正前方與正北方向的夾角就是該值。
values[1]:手機繞著x軸旋轉的角度。取值範圍是-180到+180度之間。
values[2]:手機繞著y軸旋轉的角度。取值範圍是-90到+90度之間。
4.Sensor.TYPE_LIGHT:光線感應器
values[0]:環境光線水平勒克斯單位值。
5.Sensor.TYPE_PRESSURE:壓力感應器
values[0]:大氣壓力值,單位帕。
6.Sensor.TYPE_PROXIMITY: 近程感應器
values[0]:以厘米為單位的距離值。
7.Sensor.TYPE_RELATIVE_HUMIDITY:濕度感應器
values[0]: 周圍空氣相對濕度百分比。
8.Sensor.TYPE_TEMPERATURE: 溫度感應器
values[0]: 周圍環境溫度的攝氏度值。
Android API中共定義了十幾種感應器的類型,每一部手機不可能支援所有的感應器類型,當通過getDefaultSensor方法返回值為null時表示該手機不支援這種類型的感應器,當我們為不支援的感應器註冊了監聽事件,並不會引發異常,只是不能得到任何有效資料。
三、實踐加速度感應器實現搖一搖功能
接下來,我們通過代碼來類比一個搖一搖的功能,主要是通過加速度感應器來實現,當觸發事件時,我們調用手機震動器,並一個Toast顯示。調用手機震動提示時需要為我們的app添加許可權。
<uses-permission android:name="android.permission.VIBRATE" />
接下來是我們的代碼部分
package com.example.shaketest;import android.app.Activity;import android.content.Context;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import android.hardware.SensorManager;import android.os.Bundle;import android.os.Vibrator;import android.util.Log;import android.view.Menu;import android.widget.Toast;public class MainActivity extends Activity {private SensorManager mSensorManager;// 感應器管理類private Vibrator mVibrator;// 震動器private static final String TAG = "MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);mVibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);// 獲得手機震動器}@Overrideprotected void onPause() {// TODO Auto-generated method stubsuper.onPause();if (mSensorManager != null) {mSensorManager.unregisterListener(mySensorListener);}}@Overrideprotected void onResume() {// TODO Auto-generated method stubsuper.onResume();if (mSensorManager != null) {// 第一個參數是Listener,第二個參數是所得感應器類型,第三個參數值擷取感應器資訊的頻率mSensorManager.registerListener(mySensorListener,mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_NORMAL);// SensorManager.SENSOR_DELAY_NORMAL:預設的獲得感應器資料的速度。// SensorManager.SENSOR_DELAY_GAME:如果利用感應器開發遊戲,建議使用該值。// SensorManager.SENSOR_DELAY_UI:如果使用感應器更新UI中的資料,建議使用該值。}}private SensorEventListener mySensorListener = new SensorEventListener() {@Overridepublic void onAccuracyChanged(Sensor sensor, int degree) {// TODO Auto-generated method stub// 當感應器的精準度發生改變時被調用,int為新的感應器精度}@Overridepublic void onSensorChanged(SensorEvent event) {// TODO Auto-generated method stub// 感應器資訊改變時執行該方法float[] values = event.values;// 該變數最多隻有3個元素,而且根據感應器的不同,values變數中元素所代表的含義也不同。float x = values[0]; // x軸方向的重力加速度float y = values[1]; // y軸方向的重力加速度float z = values[2]; // z軸方向的重力加速度// 設定重力加速度值,當搖晃到達該值時觸發震動,並相應自己的事件int medumValue = 19;if (Math.abs(x) > medumValue) {mVibrator.vibrate(500);Log.w(TAG, "x_shake");Log.w(TAG, "x軸::" + x + ";y軸::" + y + ";z軸::" + z);Toast.makeText(MainActivity.this, "Shaking!!!!",Toast.LENGTH_SHORT).show();}if (Math.abs(y) > medumValue) {mVibrator.vibrate(500);Log.w(TAG, "y_shake");Log.w(TAG, "x軸::" + x + ";y軸::" + y + ";z軸::" + z);Toast.makeText(MainActivity.this, "Shaking!!!!",Toast.LENGTH_SHORT).show();}if (Math.abs(z) > medumValue) {mVibrator.vibrate(500);Log.w(TAG, "z_shake");Log.w(TAG, "x軸::" + x + ";y軸::" + y + ";z軸::" + z);Toast.makeText(MainActivity.this, "Shaking!!!!",Toast.LENGTH_SHORT).show();}}};@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}}
Android開發--常用的感應器總結