Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android開發--常用的傳感器總結

Android開發--常用的傳感器總結

編輯:關於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添加權限。

接下來是我們的代碼部分
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";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
		mVibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);// 獲得手機振動器
	}

	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
		super.onPause();
		if (mSensorManager != null) {
			mSensorManager.unregisterListener(mySensorListener);
		}
	}

	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.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() {

		@Override
		public void onAccuracyChanged(Sensor sensor, int degree) {
			// TODO Auto-generated method stub
			// 當傳感器的精准度發生改變時被調用,int為新的傳感器精度
		}

		@Override
		public 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();
			}
		}

	};

	@Override
	public 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;
	}

}



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