星期五, 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();
參考各式各樣的手機與電信系統文章。