構建Android電話相關的應用
上次介紹了一下Android的RIL架構,我們可以把它理解為是GSM模塊的驅動,這次要介紹的是Telephony這個組件,我們把它和WinCE做對比,發(fā)現它其實就是做了CellCore做的工作,只是CellCore依然很面向過程地單純導出SDK,然后讓上層驅動調用。Telephony由于是運行在我們的Dalvik虛擬機上面的,所以它的實現也就更面向對象化了。接下來讓我們看看怎么使用這個Telephony庫開發(fā)我們的電話應用。
Telephony庫主要負責Android的撥打與接聽電話功能,其中有兩個重要的類分別是IPhone和PhoneNumberUtils是我們實現電話功能必不可少的。當我們的應用需要撥打一個號碼的時候,Android默認是沒有授予我們這個應用的這個權限的,因此我們必須在AndroidManifest.xml中去打開這個權限。AndroidManifest.xml是每一個應用都需要的文件,它位于應用的根目錄下,文件里描述了程序包的全局變量,包括暴露的應用組件(activities, services等等)和為每個組件的實現類,以及什么樣的數據可以操作和它在什么地方運行?,F在我們在<manifest>里面添加一行:
從此我們的應用就擁有了撥打電話的權限了,接下來就是建立一個IPhone類的對象,上次我已經介紹了必須要通過ServiceManager來獲得,以下代碼演示了如何建立一個IPhone類對象:
{
IServiceManager sm = ServiceManagerNative.getDefault();
IPhone phoneService = IPhone.Stub.asInterface(sm.getService("phone"));
return phoneService;
}
一旦建立完了IPhone對象,即可使用call或者dail方法來撥電話了:
void dial(String number)
它們之間的差別就是call是在后臺進行的,一般用于數據傳輸(gprs,edge)的應用,而dial是會顯示一個簡單的撥號界面,上面預設了你的參數作為撥號的號碼,如果給dial的參數傳入NULL,則會調用撥號的界面顯示出來。
還有一種簡單的撥號方法,有仔細看Intent文檔的人就會發(fā)現,對一個電話格式的網址(如href="tel+86)1234567890")發(fā)送出CALL_ACTION,就可以調用撥號程序對其進行撥號。這種方便的方法可以在開發(fā)我們的瀏覽器應用的時候,直接在瀏覽網頁的時候正則匹配到電話號碼,然后直接調用撥號程序對其撥號,很方便吧。
獲取電話的屬性可以通過TelephonyProperties來實現,比如SIM卡,IMEI等信息,我們可以通過調用os.SystemProperties.put()方法傳入TelephonyProperties的字段來設置對應的參數,也可以通過os.SystemProperties.get()方法獲取這些參數,以下是一些實際引用的例子:
獲取本機號碼,調用android.os.SystemProperties.get(PROPERTY_LINE1_NUMBER);
獲取IMEI,調用android.os.SystemProperties.get(PROPERTY_IMEI);
獲取運營商名字,調用android.os.SystemProperties.get(PROPERTY_SIM_OPERATOR_ALPHA);
獲取國家代碼,調用android.os.SystemProperties.get(PROPERTY_SIM_OPERATOR_ISO_COUNTRY);
獲取語音信箱號碼,調用哪個android.os.SystemProperties.get(PROPERTY_LINE1_VOICE_MAIL_NUMBER);
【編輯推薦】