> 本講內(nèi)容:Android傳感器編程入門,分別包括加速度傳感器(accelerometer),陀螺儀(gyroscope),環(huán)境光照傳感器(light),磁力傳感器(magnetic field),方向傳感器(orientation),壓力傳感器(pressure),距離傳感器(proximity)和溫度傳感器(temperature)一、前言我很喜歡電腦,可是筆記本還是太大,筆記本電腦再小還是要弄個(gè)小包背起來的,智能手機(jī)則不同,它完全就是一個(gè)手機(jī),可以隨意裝在一個(gè)口袋里隨身攜帶。因此我在2002年左右時(shí)最喜歡玩裝備是Dell的PDA,2007年的時(shí)候最喜歡玩的是N73,而在2010年最喜歡玩的則是Milestone。眼見著手機(jī)的功能越來越強(qiáng),時(shí)至今日智能手機(jī)甚至在某些方面已經(jīng)強(qiáng)過了臺(tái)式機(jī)和筆記本。本節(jié)課講的就是智能手機(jī)強(qiáng)過臺(tái)式機(jī)和筆記本的地方:傳感器。
2008年的時(shí)候我很喜歡我的小白筆記本Macbook,喜歡玩它的一個(gè)小軟件,一拍桌子,筆記本感受到了震動(dòng),它就轉(zhuǎn)換了一個(gè)桌面出來,這讓我像個(gè)小孩子一樣沒事就拍拍桌子。這一功能這得益于蘋果筆記本內(nèi)置有傳感器。
我不知道iPhone手機(jī)是不是第一個(gè)把各種各樣的傳感器運(yùn)用在手機(jī)上的,不過我知道iPhone是把傳感器運(yùn)用在手機(jī)上最成功的第一個(gè)。隨后的Android系統(tǒng)也內(nèi)置了大量的傳感器,這讓Android系統(tǒng)手機(jī)和普通的諾基亞智能機(jī)和Windows CE智能機(jī)相比牛氣了許多,在擁有了Milestone之后,我的N73就被仍在抽屜的角落里了。
從Android1.5開始,系統(tǒng)內(nèi)置了對(duì)多達(dá)八種傳感器的支持,他們分別是:加速度傳感器(accelerometer),陀螺儀(gyroscope),環(huán)境光照傳感器(light),磁力傳感器(magnetic field),方向傳感器(orientation),壓力傳感器(pressure),距離傳感器(proximity)和溫度傳感器(temperature)。
利用這些傳感器我們可以制作出各種有趣的應(yīng)用程序和游戲。譬如在口袋里晃一晃手機(jī),手機(jī)就開始神不知鬼不覺的錄音,不要著急這個(gè)很容易做,我們?cè)诒疚牡慕Y(jié)尾就一起制作這個(gè)小應(yīng)用。
本講的學(xué)習(xí)方式還是在實(shí)戰(zhàn)中學(xué)習(xí),需要提醒的是模擬器中無法模擬傳感器,因此你需要準(zhǔn)備一款A(yù)ndroid真機(jī)才能運(yùn)行本講的例子。
二、實(shí)例:手機(jī)傳感器清單我們還是先看程序后解釋,1、創(chuàng)建一個(gè)項(xiàng)目 Lesson37_HelloSensor , 主Activity名字叫 mainActivity.java2、UI布局文件main.xml的內(nèi)容如下:
- <?xml version="1.0" encoding="utf-8"?>
<linearlayout android:layout_height="fill_parent" android:layout_width="fill_parent" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android">
<textview android:layout_height="wrap_content" android:layout_width="fill_parent" android:text="" android:id="@+id/TextView01">
</textview></linearlayout>
復(fù)制代碼 3、mainActivity.java的內(nèi)容如下:
- package basic.android.lesson37;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//準(zhǔn)備顯示信息的UI組建
final TextView tx1 = (TextView) findViewById(R.id.TextView01);
//從系統(tǒng)服務(wù)中獲得傳感器管理器
SensorManager sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
//從傳感器管理器中獲得全部的傳感器列表
List<sensor> allSensors = sm.getSensorList(Sensor.TYPE_ALL);
//顯示有多少個(gè)傳感器
tx1.setText("經(jīng)檢測(cè)該手機(jī)有" + allSensors.size() + "個(gè)傳感器,他們分別是: - ");
//顯示每個(gè)傳感器的具體信息
for (Sensor s : allSensors) {
String tempString = " - " + " 設(shè)備名稱:" + s.getName() + "
- " + " 設(shè)備版本:" + s.getVersion() + "
- " + " 供應(yīng)商:"
+ s.getVendor() + " - ";
switch (s.getType()) {
case Sensor.TYPE_ACCELEROMETER:
tx1.setText(tx1.getText().toString() + s.getType() + " 加速度傳感器accelerometer" + tempString);
break;
case Sensor.TYPE_GYROSCOPE:
tx1.setText(tx1.getText().toString() + s.getType() + " 陀螺儀傳感器gyroscope" + tempString);
break;
case Sensor.TYPE_LIGHT:
tx1.setText(tx1.getText().toString() + s.getType() + " 環(huán)境光線傳感器light" + tempString);
break;
case Sensor.TYPE_MAGNETIC_FIELD:
tx1.setText(tx1.getText().toString() + s.getType() + " 電磁場(chǎng)傳感器magnetic field" + tempString);
break;
case Sensor.TYPE_ORIENTATION:
tx1.setText(tx1.getText().toString() + s.getType() + " 方向傳感器orientation" + tempString);
break;
case Sensor.TYPE_PRESSURE:
tx1.setText(tx1.getText().toString() + s.getType() + " 壓力傳感器pressure" + tempString);
break;
case Sensor.TYPE_PROXIMITY:
tx1.setText(tx1.getText().toString() + s.getType() + " 距離傳感器proximity" + tempString);
break;
case Sensor.TYPE_TEMPERATURE:
tx1.setText(tx1.getText().toString() + s.getType() + " 溫度傳感器temperature" + tempString);
break;
default:
tx1.setText(tx1.getText().toString() + s.getType() + " 未知傳感器" + tempString);
break;
}
}
}
}</sensor>
復(fù)制代碼
4、連接真機(jī)Milestone,編譯并運(yùn)行程序,顯示結(jié)果如下: 5、結(jié)合上面的程序我們做一些解釋。 Android所有的傳感器都?xì)w傳感器管理器 SensorManager 管理,獲取傳感器管理器的方法很簡(jiǎn)單:
String service_name = Context.SENSOR_SERVICE;
SensorManager sensorManager = (SensorManager)getSystemService(service_name); 現(xiàn)階段Android支持的傳感器有8種,它們分別是:
傳感器類型常量</div |