星期五, 6月 29, 2012

Sensor (三)

Android應用程式學習筆記

Motion Sensors

Android平台提供好幾個感應器讓我們監測裝置的運動,這些感應器中有些是以硬體為基礎感應產生數據,有些是透過硬體感應器得到的數據再經由軟體運算產生數據。

運動感測器主要用來監測裝置的運動,比如傾斜、震動、旋轉、擺動。這運動我們可以看成兩類,第一類運動通常是使用者直接輸入的反射(例如使用在遊戲中操控汽車,或是使用者在遊戲中控制球),第二類是裝置在自然環境下的反射(例如裝置與你在車中一起移動)。由運動感應器通常無法用來監測裝置位置,但是可以和其他感應器一起使用,例如地磁場感應器,決定裝置的位置。


所有的運動感應器對於每一個SensorEvent都是回傳多維度的陣列數據,通常都是float型態的陣列。下表總結了在Android平台可用的運動感應器。



SensorSensor event dataDescriptionUnits of measure
TYPE_ACCELEROMETERSensorEvent.values[0]Acceleration force along the x axis (including gravity).m/s2
SensorEvent.values[1]Acceleration force along the y axis (including gravity).
SensorEvent.values[2]Acceleration force along the z axis (including gravity).
TYPE_GRAVITYSensorEvent.values[0]Force of gravity along the x axis.m/s2
SensorEvent.values[1]Force of gravity along the y axis.
SensorEvent.values[2]Force of gravity along the z axis.
TYPE_GYROSCOPESensorEvent.values[0]Rate of rotation around the x axis.rad/s
SensorEvent.values[1]Rate of rotation around the y axis.
SensorEvent.values[2]Rate of rotation around the z axis.
TYPE_LINEAR_ACCELERATIONSensorEvent.values[0]Acceleration force along the x axis (excluding gravity).m/s2
SensorEvent.values[1]Acceleration force along the y axis (excluding gravity).
SensorEvent.values[2]Acceleration force along the z axis (excluding gravity).
TYPE_ROTATION_VECTORSensorEvent.values[0]Rotation vector component along the x axis (x * sin(θ/2)).Unitless
SensorEvent.values[1]Rotation vector component along the y axis (y * sin(θ/2)).
SensorEvent.values[2]Rotation vector component along the z axis (z * sin(θ/2)).
SensorEvent.values[3]Scalar component of the rotation vector ((cos(θ/2)).1


在運動偵測和監測上,旋轉向量感應器與重力感應器是最常使用的感應器。旋轉向量感應器應用範圍很廣,比如偵測手勢、監測角度的變化、監測方向的變化。


Android Open Source Project Sensors


Android open source project(AOSP)提供三種基於軟體的感應器,重力感應器、線性加速感應器、旋轉向量感應器,這些感應器在Android 4.0中更新且現在利用裝置上的陀螺儀改善穩定性和效能,如果你想試著使用這些感應器,可以使用getVendor()和getVersion()方法便是它們。用vendor和vesion號碼辨識它們是有必要的,因為Android系統將這些感應器是為次要的感應器。例如,如果你的裝置製造商有提供它們自己的重力感應器,那麼AOSP的重力感應器就會顯示為次要的感應器。這三個感應器接依賴陀螺儀,所以如果裝置沒有陀螺儀,這些感應器就不會顯示,也不能使用。


星期二, 6月 26, 2012

Telephony(一)

Android應用程式學習筆記

TelephonyManager


TelephonyManager是Telephony套件中的一個類別,主要存取有關裝置上有關電話服務的資訊,應用程式可以利用此類別提供的方法決定電話服務與狀態;應用程式也可以註冊監聽器接收電話狀態的改變通知。

不需要直接創建此類別的實列,你可以透用Context.getSystemService(Context.TELEPHONY_SERVICE)獲得TelephonyManager實例。

注意,有些電話資訊有權限的保護,所以想獲得一些電話資訊時,必須在Manifest文件中宣告相對應的權限。

int getCallState();
取得通話狀態,回傳值為整數,分別為
CALL_STATE_IDLE閒置狀態、
CALL_STATE_OFFHOOK通話狀態、
CALL_STATE_RINGING來電狀態。

CellLocation getCellLocation();
取得基地台的位置。
需宣告權限ACCESS_COARSE_LOCATION或是ACCESS_FINE_LOCATION。

int getDataActivity();
取得行動網路運作狀態。
DATA_ACTIVITY_IN行動網路運作狀態為正在接收數據、
DATA_ACTIVITY_OUT行動網路運作狀態為正在發送數據、
DATA_ACTIVITY_INOUT行動網路運作狀態為正在接收及發送數據、
DATA_ACTIVITY_NONE行動網路運作狀態為無任何數據接收與發送。

int getDataState();
取得行動網路連線狀態。
DATA_CONNECTED行動網路連線狀態為已連線、
DATA_CONNECTING行動網路連線狀態為正在連線、
DATA_DISCONNECTED行動網路連線狀態為離線、
DATA_SUSPENDED行動網路連線狀態為暫停。

String getDeviceId();
取得裝置的唯一識別碼,GSM行動網路為IMEI識別碼;ESN或是CDMA行動網路為MEID識別碼。
需宣告權限READ_PHONE_STATE。

String getDeviceSoftwareVersion()
取得裝置的軟體版本編號,例如GSM為IMEI/SV碼。
需宣告權限READ_PHONE_STATE。

String getLine1Number();
取得Line1的號碼,例如,GSM電話為MSISDN號碼。
需宣告權限READ_PHONE_STATE。

List<NeighborCellInfo> getNeighborCellInfo();
取得鄰近裝置的基地台資訊。

String getNetworkCountryIso();
取得標準的國際國家碼,及長途區碼

String getNetworkOperator();
取得MCC+MNC代碼(sim卡營運商+營運商網路代碼)


String getNetworkOperatorName();
取得電信營運商的名字。

int getNetworkType();
取得行動網路的類型。
NETWORK_TYPE_UNKNOW行動網路類行為未知、
NETWORK_TYPE_GPRS行動網路類行為GPRS、
NETWORK_TYPE_EDGE行動網路類行為EDGE、
NETWORK_TYPE_UMTS行動網路類行為UMTS、
NETWORK_TYPE_HSDPA行動網路類行為HSDPA、
NETWORK_TYPE_HSDPA行動網路類行為HSDPA、
NETWORK_TYPE_HSPA行動網路類行為HSPA、
NETWORK_TYPE_CDMA行動網路類行為CDMA、
NETWORK_TYPE_EVDO_0行動網路類行為EVDO_0、
NETWORK_TYPE_EVDO_A行動網路類行為EVDO_A、
NETWORK_TYPE_EVDO_B行動網路類行為EVDO_B
NETWORK_TYPE_1xRTT行動網路類行為1xRTT、
NETWORK_TYPE_IDEN行動網路類行為IDEN、
NETWORK_TYPE_LTE行動網路類行為LTE、
NETWORK_TYPE_EHRPO行動網路類行為EHRPO、
NETWORK_TYPE_HSPAP行動網路類行為HSPAP


int getPhoneType();
取得電話系統類型。
PHONE_TYPE_NONE電話系統為未知、
PHONE_TYPE_GSM電話系統為GSM、
PHONE_TYPE_CDMA電話系統為CDMA、
PHONE_TYPE_SIP電話系統為SIP

String getSimCountryIso();
取得sim卡供應商的國家識別碼。

String getSimOperator();
取得MCC+MNC代碼(mobile country code + mobile network code),大約是5或6個位數

String getSimOperatorName();
取得供應商名字。

String getSimSerialNumber();
取得sim卡序號。
需宣告權限READ_PHONE_STATE。

int getSimState();
取得sim卡狀態。
SIM_STATE_UNKNOWsim卡狀態為未知、
SIM_STATE_ABSENTsim卡狀態為未找到、
SIM_STATE_PIN_REQUIREDsim卡PIN被鎖定,需要User PIN解鎖、
SIM_STATE_PUN_REQUIREDsim卡PUN被鎖定,需要User PUN解鎖、
SIM_STATE_NETWORK_LOCKEDsim卡網路被鎖,需要Network PIN解鎖、
SIM_STATE_READYsim卡可用

String getSubscriberId();
取得用戶唯一識別碼,例如GSM的IMSI識別碼。
需宣告權限READ_PHONE_STATE。

String getVoiceMailAlphaTag();
取得語音信箱關聯的標示。
需宣告權限READ_PHONE_STATE。

String getVoiceMailNumber();
取得語音郵件號碼。
需宣告權限READ_PHONE_STATE。

boolean isNetworkRoaming();
取得手機是否處在漫遊狀態

void listen(PhoneStateListener listenr , int events)
註冊監聽器,接收電話狀態改變的通知。


例子
getNetworkOperator()取得的數值,台灣區的列表。
返回數值為46601為遠傳電信、46602亞太電信、...。

國別語系電信商識別代碼電信商名稱電信網路識別代碼電信網路名稱備註







tw 中文 46601 遠傳電信 46601 遠傳電信 Far EasTone 
tw 46602 亞太電信 46602 亞太電信 Asia Pacific Telecom 
tw 46689 威寶電信 46689 威寶電信 Vibo Telecom 
tw 中文 46692 46692 中華電信 Chunghwa 
tw 中文 46697 台灣大哥大 46697 台灣大哥大 TWN GSM 
參考移動網路代碼

getPhoneType();
參考各式各樣的手機與電信系統文章。




星期四, 5月 17, 2012

Sensor (二)

Anroid應用程式學習筆記

Sensor Overview

大部分的Android裝置有感應器讓你監測裝置在移動和位置的變化,許多裝置也有監測周遭環境的感應器,比如溫度、濕度、壓力及亮度,你可以藉由Android感應器框架存取這些裝置與取得感應器的數據。

Android感應器框架提供許多類別與介面幫助你執行廣泛與感應器有關的任務,例如你可以使用感應器框架完成以下任務:
  • 決定在裝置的哪一個感應器是可用的。
  • 決定一個個別的感應器的能力,比如它的最大範圍、廠商、電源要求等。
  • 取得感應器數據。
  • 註冊與註銷事件監聽器。
此主題提供在Android裝置上可用的感應器的概觀,及感應器框架的介紹。


Introduction to Sensors

Android感應器框架讓你存取許多類型的感應器,一些感應器是基於硬體的,一些感應器是基於軟體的。基於硬體的感應器是建在手持裝置或平板裝置的物理元件,這些硬體感應器截油直接測量特定環境屬性提供數據,比如加速、地磁強度或是角度改變。基於軟體的感應器不是物理裝置,雖然他們模擬基於硬體的感應器。基於軟體的感應器從一個或是多個基於硬體的感應器產生數據,且基於軟體的感應器有時也叫做虛擬感應器或是合成感應器。線性加速感應器與重力感應器是基於軟體的感應器的例子。下表總結了Android平台支援的感應器。

少數的Android裝置有美意種類型的感應器。例如,大部分的手持裝置或平板電腦有一個加速度計和磁力儀,但少數的裝置有晴雨表或溫度計。還有一個裝置可以擁有多個同一類型的感應器。例如,一個裝置可以有兩個重力感應器,兩個有不同的範圍。


Table 1. Sensor types supported by the Android platform.
SensorTypeDescriptionCommon Uses
TYPE_ACCELEROMETERHardwareMeasures the acceleration force in m/s2 that is applied to a device on all three physical axes (x, y, and z), including the force of gravity.Motion detection (shake, tilt, etc.).
TYPE_AMBIENT_TEMPERATUREHardwareMeasures the ambient room temperature in degrees Celsius (°C). See note below.Monitoring air temperatures.
TYPE_GRAVITYSoftware or HardwareMeasures the force of gravity in m/s2 that is applied to a device on all three physical axes (x, y, z).Motion detection (shake, tilt, etc.).
TYPE_GYROSCOPEHardwareMeasures a device's rate of rotation in rad/s around each of the three physical axes (x, y, and z).Rotation detection (spin, turn, etc.).
TYPE_LIGHTHardwareMeasures the ambient light level (illumination) in lx.Controlling screen brightness.
TYPE_LINEAR_ACCELERATIONSoftware or HardwareMeasures the acceleration force in m/s2 that is applied to a device on all three physical axes (x, y, and z), excluding the force of gravity.Monitoring acceleration along a single axis.
TYPE_MAGNETIC_FIELDHardwareMeasures the ambient geomagnetic field for all three physical axes (x, y, z) in μT.Creating a compass.
TYPE_ORIENTATIONSoftwareMeasures degrees of rotation that a device makes around all three physical axes (x, y, z). As of API level 3 you can obtain the inclination matrix and rotation matrix for a device by using the gravity sensor and the geomagnetic field sensor in conjunction with the getRotationMatrix() method.Determining device position.
TYPE_PRESSUREHardwareMeasures the ambient air pressure in hPa or mbar.Monitoring air pressure changes.
TYPE_PROXIMITYHardwareMeasures the proximity of an object in cm relative to the view screen of a device. This sensor is typically used to determine whether a handset is being held up to a person's ear.Phone position during a call.
TYPE_RELATIVE_HUMIDITYHardwareMeasures the relative ambient humidity in percent (%).Monitoring dewpoint, absolute, and relative humidity.
TYPE_ROTATION_VECTORSoftware or HardwareMeasures the orientation of a device by providing the three elements of the device's rotation vector.Motion detection and rotation detection.
TYPE_TEMPERATUREHardwareMeasures the temperature of the device in degrees Celsius (°C). This sensor implementation varies across devices and this sensor was replaced with the TYPE_AMBIENT_TEMPERATURE sensor in API Level 14Monitoring temperatures.
Sensor Framework


你可以使用Android感應器框架存取這些感應器與取得原始數據,感應器框架為android.hardware套件的一部分,包括以下類別與介面:

SensorManager
你可以使用此類別創造一個感應器服務實例,此類別提供許多方法來存取與列表感應器、註冊與註銷感應器事件監聽器、取得方向資訊。此類別也提供許多用來回報感應器準確度、數據回報率、及校準感應器的感應器常數。
Sensor
你可以使用此類別創造一個指定感應器實例,此類別提供多種方法讓你決定一個感應器的能力。
SensorEvent
系統利用此類別產生一個感應器事件物件,用物件來提供有關感應器事件的資訊。一個感應器事件物件包括以下資訊:原始感應器數據、產生事件的感應器的型態、數據的準確度、事件的時間戳。
SensorEventListener
你可以利用此介面產生兩個回呼方法,當感應器數值改變時或是當感應器準確度改變時接收通知的方法。

在使用這些與感應器有關的API的典型應用程式中施行兩個基本任務:

  • 查明感應器與感應器能力
    • 如果你的應用程式有依賴特定感應器類型與能力的功能,在運行時能查明感應器與感應器的能力是很有用的。例如,你可能想要查明你的裝置中所有的感應器且停用這些依賴了裝置中所沒有的感應器的功能。同樣地,你可能想查明所有指定類型的感應器,選擇能在你的應用程式上有最佳執行效果的感應器執行。
  • 監聽感應器事件
    • 監聽感應器事件來取得原始數據的,一個感應器偵測到參數的改變時會發生一個感應器事件,感應器事件提供了四個資訊:觸發事件的感應器名稱、事件的時間戳、事件的準確度、觸發事件的原始數據。

Sensor Avaibability

當感應器的可用性從一個裝置到另一個裝置之間有所變化時,同樣在Android版本間也有所變化。下表總結了各版本可用的感應器。


Table 2. Sensor availability by platform.
SensorAndroid 4.0
(API Level 14)
Android 2.3
(API Level 9)
Android 2.2
(API Level 8)
Android 1.5
(API Level 3)
TYPE_ACCELEROMETERYesYesYesYes
TYPE_AMBIENT_TEMPERATUREYesn/an/an/a
TYPE_GRAVITYYesYesn/an/a
TYPE_GYROSCOPEYesYesn/a1n/a1
TYPE_LIGHTYesYesYesYes
TYPE_LINEAR_ACCELERATIONYesYesn/an/a
TYPE_MAGNETIC_FIELDYesYesYesYes
TYPE_ORIENTATIONYes2Yes2Yes2Yes
TYPE_PRESSUREYesYesn/a1n/a1
TYPE_PROXIMITYYesYesYesYes
TYPE_RELATIVE_HUMIDITYYesn/an/an/a
TYPE_ROTATION_VECTORYesYesn/an/a
TYPE_TEMPERATUREYes2YesYesYes
1 This sensor type was added in Android 1.5 (API Level 3), but it was not available for use until Android 2.3 (API Level 9).
2 This sensor is available, but it has been deprecated.