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